arrays.stream()配合flatmap展平多维数组需区分基本型与引用型:int[][]用flatmaptoint,string[][]等用flatmap;须filter非空防npe;三维数组需嵌套两次flatmap;收尾注意类型转换如toarray()或boxed()。

用 Arrays.stream() 配合 flatMap 展平多维数组,关键不是“拼接”,而是逐层解包、类型对齐、安全兜底——尤其要注意基本类型和引用类型的处理差异。
区分二维数组类型:基本型 vs 引用型
二维数组分两类,处理方式不同:
-
基本类型二维数组(如 int[][]):不能直接用
Arrays.stream(arr).flatMap(...),因为Arrays.stream(int[][])返回的是IntStream的包装流(Stream<int></int>),需用flatMapToInt才能对接Arrays::stream -
引用类型二维数组(如 String[][]):
Arrays.stream(arr)返回Stream<string></string>,可直接flatMap(Arrays::stream)
基础展平写法(带类型适配)
常见场景的正确写法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 整型二维数组 →
IntStream:int[][] data = {{1,2}, {3,4,5}};<br> IntStream flatInts = Arrays.stream(data).flatMapToInt(Arrays::stream); - 字符串二维数组 →
Stream<string></string>:String[][] words = {{"a","b"}, {"c"}};<br> Stream<string> flatWords = Arrays.stream(words).flatMap(Arrays::stream);</string> - 对象数组(如
Integer[][])→Stream<integer></integer>:Integer[][] nums = {{1,2}, {3}};<br> Stream<integer> flatNums = Arrays.stream(nums).flatMap(Arrays::stream);</integer>
空行与 null 元素防护
生产环境常遇到 null 行或空数组,直接调用 Arrays::stream 会抛 NullPointerException 或返回空流但不报错。稳妥做法是提前过滤:
- 跳过
null行:.filter(Objects::nonNull) - 跳过空数组:
.filter(arr -> arr.length > 0) - 组合使用(推荐):
Arrays.stream(data)<br> .filter(Objects::nonNull)<br> .filter(arr -> arr.length > 0)<br> .flatMapToInt(Arrays::stream);
链式 flatMap 处理更深嵌套(如三维数组)
flatMap 每次只降一层。面对 int[][][],需两次 flatMap:
- 三维整型数组展平:
int[][][] cube = {{{1},{2}}, {{3,4}}, {{5}}};<br> IntStream flat3D = Arrays.stream(cube)<br> .filter(Objects::nonNull)<br> .flatMapToInt(arr2D -> Arrays.stream(arr2D)<br> .filter(Objects::nonNull)<br> .flatMapToInt(Arrays::stream)); - 注意:第二层仍要用
flatMapToInt,因内层仍是int[]
转成集合或数组的收尾建议
展平后通常要落地,注意类型匹配:
-
IntStream→int[]:.toArray() -
IntStream→List<integer></integer>:.boxed().collect(Collectors.toList()) -
Stream<string></string>→String[]:.toArray(String[]::new) - 避免常见错误:对
IntStream调用.collect(Collectors.toList())会编译失败,必须先boxed()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










