You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java数组是否有drop方法?如何实现类似Scala的数组范围截取?

Java中类似Scala Array.drop()的实现方式

好问题!Java标准库的原生数组确实没有提供像Scala里那样开箱即用的drop()和take()方法,但我们有几种简洁的方案来实现相同的效果,不用手动逐个遍历元素~

1. 最直接:使用Arrays.copyOfRange()

这是Java原生数组截取最常用的方法,完全可以实现drop(n).take(m)的组合效果。它的参数规则是:Arrays.copyOfRange(原数组, 起始索引(包含), 结束索引(不包含))。

对应你要的drop(10).take(16),就是跳过前10个元素,取接下来的16个,代码示例如下:

// 假设原数组是int类型
int[] originalArray = {0, 1, 2, 3, ..., 25, 26, ...};
// 跳过前10个,取接下来的16个元素
int[] targetArray = Arrays.copyOfRange(originalArray, 10, 10 + 16);

小提示:如果原数组的长度不足以支撑到10+16的索引,这个方法会自动截取到数组末尾,不会抛出越界异常,非常安全。

2. 函数式风格:用Stream API(Java 8+)

如果你习惯Scala的函数式写法,Java 8及以上的Stream API可以完美匹配drop()和take()的语义:

  • skip(n)对应Scala的drop(n),跳过前n个元素
  • limit(m)对应Scala的take(m),取接下来的m个元素

代码示例:

int[] targetArray = Arrays.stream(originalArray)
                         .skip(10)   // 跳过前10个
                         .limit(16)  // 取接下来的16个
                         .toArray();

这种方式的优势是可以和其他Stream操作(比如过滤、映射)链式调用,灵活性更强。

3. 借助集合类(备选方案)

如果你的场景本来就在操作集合,可以先把数组转成List,再用subList()方法实现类似效果,但注意基本类型数组转List需要先转成包装类型数组:

// 先把int数组转成Integer包装类数组,再转成List
List<Integer> originalList = Arrays.asList(Arrays.stream(originalArray).boxed().toArray(Integer[]::new));
// 截取从索引10到10+16的子列表(注意subList的结束索引也是不包含的)
List<Integer> subList = originalList.subList(10, 10 + 16);
// 再转回数组
Integer[] targetArray = subList.toArray(new Integer[0]);

这个方式相对繁琐一些,更适合已经在处理集合的场景,否则还是前两种方法更高效。

内容的提问来源于stack exchange,提问作者Ivan Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:22:13