flatMapToInt用于将每个元素映射为IntStream并扁平合并,适用于二维数组或List<int[]>等嵌套结构,需配合Arrays::stream使用,避免null子数组,JDK16+支持Function<T, IntStream>参数。

flatMapToInt 用于将每个元素映射为一个 IntStream,再把所有流扁平合并成单个 IntStream,特别适合处理“集合中含数组/数字序列”的嵌套结构。
核心用法:把二维数组或 List 转成单一 IntStream
它接收一个 ToIntFunction<T> 函数,该函数对每个输入元素返回一个 IntStream。常见场景是把 int[] 转为 IntStream,再自动拼接。
- 对
int[][]:用Arrays::stream把每行转成IntStream - 对
List<int[]>:同样用Arrays::stream处理每个子数组 - 不能直接传
int[]给 flatMapToInt —— 它操作的是流的每个元素,不是整个数组
典型示例:二维数组转 IntStream
比如有 int[][] data = {{1, 2}, {3, 4, 5}, {6}};:
IntStream stream = Arrays.stream(data)
.flatMapToInt(Arrays::stream); // 每个 int[] → IntStream,再扁平
// 结果:1, 2, 3, 4, 5, 6
注意:Arrays.stream(data) 返回的是 Stream<int[]>,不是 Stream<Integer>;Arrays::stream 在这里作为 ToIntFunction<int[]>,正好适配 flatMapToInt。
立即学习“Java免费学习笔记(深入)”;
常见错误与避坑点
- 误用
mapToInt:它只适用于单个数字,无法展开数组 - 混淆
flatMap和flatMapToInt:前者返回Stream<T>,后者专为int优化,避免装箱开销 - 传入 null 子数组:会抛
NullPointerException,建议提前过滤或判空 - 想处理
Integer[]或List<List<Integer>>?得先转成int[]或用flatMap+mapToInt配合
扩展:处理 List<List<Integer>>
若数据是 List<List<Integer>>,需先转为 int[] 或逐层展开:
List<List<Integer>> nested = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4, 5)
);
IntStream stream = nested.stream()
.flatMap(list -> list.stream().mapToInt(Integer::intValue));
// 或更简洁:.flatMapToInt(list -> list.stream().mapToInt(Integer::intValue))
注意:JDK 16+ 支持 flatMapToInt 直接接 Function<T, IntStream>,所以上面写法在新版中合法且高效。


















