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
相关产品推荐
相关产品推荐

