Java8/11中如何用flatMapToInt()将Stream<List<Integer>>转IntStream
flatMapToInt 实现逻辑
flatMapToInt 方法要求传入一个函数,将流中的每个元素映射为IntStream,最后将所有分散的IntStream合并为一个统一的基本类型整数流。
针对当前Stream<List<Integer>>的转换场景,只需要对每个遍历到的子List做流转换+拆箱即可,核心传入的lambda逻辑如下:
// 核心实现片段 IntStream list2 = list.flatMapToInt(singleList -> singleList.stream().mapToInt(Integer::intValue) );
完整可运行的示例代码:
import java.util.Arrays; import java.util.List; import java.util.stream.IntStream; import java.util.stream.Stream; public class Demo { public static void main(String[] args) { System.out.println("----flatMapToInt----"); Stream<List<Integer>> list = Stream.of( Arrays.asList(1,2,3,4), Arrays.asList(10,20,30,40) ); IntStream list2 = list.flatMapToInt(singleList -> singleList.stream().mapToInt(Integer::intValue) ); // 遍历输出验证结果:1 2 3 4 10 20 30 40 list2.forEach(num -> System.out.print(num + " ")); } }
逻辑说明
- 遍历外层流时,
singleList代表当前处理到的每一个List<Integer>实例 - 调用
singleList.stream()将单个List转为Stream<Integer>包装类型对象流 - 调用
mapToInt(Integer::intValue)将包装类型流拆箱为基本类型int组成的IntStream,满足flatMapToInt的返回值要求 - 最终
flatMapToInt会自动将所有子List生成的IntStream打平合并,得到最终需要的整数基本类型流
该写法在Java 8、Java 11环境下均兼容可直接运行。如果觉得方法引用写法繁琐,也可以写成自动拆箱的简化形式:
singleList.stream().mapToInt(i -> i),运行效果完全一致。
内容的提问来源于stack exchange,提问作者Moon and Dishes
相关产品推荐
相关产品推荐

