如何使用Java Streams将数组分割为固定长度重叠子数组
嘿,这个需求本质上就是实现一个大小为3的滑动窗口来截取数组元素对吧?用Java Streams API完全可以搞定,我给你两种实用的实现方式,你可以根据自己的Java版本和场景来选:
方法一:基于IntStream生成索引(Java 8+适用)
这是最直观的方式,通过生成合法的索引范围,再映射为对应的子数组,还能顺便处理数组长度不足3的边界情况:
import java.util.Arrays; import java.util.stream.IntStream; public class SlidingWindowDemo { public static void main(String[] args) { int[] arr = {1, 3, 5, 8, 9}; // 先处理边界:数组长度小于3时直接提示 if (arr.length < 3) { System.out.println("数组长度不足3,无法生成连续三元组"); return; } // 生成滑动窗口的三元组数组 int[][] slidingTriples = IntStream.range(0, arr.length - 2) // 每个索引i对应截取从i到i+3的子数组(左闭右开,刚好取3个元素) .mapToObj(i -> Arrays.copyOfRange(arr, i, i + 3)) .toArray(int[][]::new); // 验证结果 Arrays.stream(slidingTriples) .map(Arrays::toString) .forEach(System.out::println); } }
代码解释:
IntStream.range(0, arr.length - 2):生成从0到arr.length-3的索引(因为range是左闭右开,所以上限设为arr.length-2就能覆盖所有合法的起始位置)Arrays.copyOfRange(arr, i, i+3):截取从索引i到i+2的元素(同样左闭右开规则),得到长度为3的子数组- 最后用
toArray(int[][]::new)把Stream转成二维数组,如果你需要List<int[]>,换成.collect(Collectors.toList())即可(记得导入java.util.stream.Collectors)
方法二:用Stream.iterate(Java 9+适用)
如果你的项目用的是Java 9及以上,也可以用带终止条件的Stream.iterate来生成索引,写法更灵活:
import java.util.Arrays; import java.util.stream.Stream; public class SlidingWindowDemo2 { public static void main(String[] args) { int[] arr = {1, 3, 5, 8, 9}; if (arr.length < 3) { System.out.println("数组长度不足3,无法生成连续三元组"); return; } int[][] slidingTriples = Stream.iterate(0, i -> i < arr.length - 2, // 终止条件:索引不能超过合法范围 i -> i + 1) // 索引递增规则 .map(i -> Arrays.copyOfRange(arr, i, i + 3)) .toArray(int[][]::new); // 打印结果 Arrays.stream(slidingTriples) .map(Arrays::toString) .forEach(System.out::println); } }
运行任意一种方法,输出都会是:
[1, 3, 5] [3, 5, 8] [5, 8, 9]
内容的提问来源于stack exchange,提问作者user3322836
相关产品推荐
相关产品推荐

