java 8 stream api 原生不支持二维数组扁平化,需用 arrays.stream() 结合 flatmap()(或 flatmaptoint)转为一维流;基本类型用 flatmaptoint,对象类型用 flatmap;操作包括求和、去重、过滤映射等,注意惰性求值与性能优化。

Java 8 的 Stream API 主要面向一维集合或数组,原生不支持直接对二维数组(如 int[][])进行扁平化流式处理。但通过组合 Arrays.stream() 和 flatMap(),可以高效地将二维数组转为一维流,进而完成过滤、映射、统计等操作。
将二维数组转为 Stream 流
核心思路是:先用 Arrays.stream(arr) 得到 Stream<int></int>,再用 flatMap(Arrays::stream) 把每个子数组展开为 IntStream(或其他类型流)。
例如,对整型二维数组求所有元素之和:
int[][] matrix = {{1, 2}, {3, 4}, {5}};
int sum = Arrays.stream(matrix)
.flatMapToInt(Arrays::stream)
.sum(); // 结果为 15
注意:flatMapToInt 返回的是 IntStream,适用于基本类型;若为对象数组(如 String[][]),应使用 flatMap(Arrays::stream) 得到 Stream<string></string>。
常见操作示例
-
查找最大值:用
max()配合orElse防空 -
去重并收集为 List:调用
distinct().collect(Collectors.toList()) -
筛选偶数并平方:链式调用
filter(n -> n % 2 == 0).map(n -> n * n) -
按行统计每行和:保留外层流,对每行单独用
Arrays.stream(row).sum()
处理非基本类型二维数组
对于 String[][] 或自定义对象二维数组,避免使用 flatMapToInt,改用通用的 flatMap:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
String[][] grid = {{"a", "b"}, {"c", "d"}};
List<string> all = Arrays.stream(grid)
.flatMap(Arrays::stream)
.filter(s -> !s.isEmpty())
.collect(Collectors.toList()); // ["a", "b", "c", "d"]
</string>
若需保留行列结构做分组处理,可结合 IntStream.range() 索引访问,例如生成带坐标的信息流:
IntStream.range(0, matrix.length)
.boxed()
.flatMap(i -> IntStream.range(0, matrix[i].length)
.mapToObj(j -> new int[]{i, j, matrix[i][j]}));
性能与注意事项
Stream 操作是惰性的,但二维数组扁平化会遍历全部元素,无法短路跳过后续行;若只需找第一个匹配项,findFirst() 可提前终止。
避免在循环内反复创建 Stream —— 二维数组本身不可变时,建议一次性转换后复用结果;若频繁查询,考虑预处理为一维列表。
原始类型二维数组(如 int[][])不能直接用 Stream<int></int> 做对象级操作,需明确选择 IntStream 或包装为 Stream<integer></integer>(后者有装箱开销)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










