Stream API flatMap()方法介绍
flatMap()简介
flatMap 的主要作用是将一个流中的每个元素转换为另一个流,然后将这些流合并成一个单一的流。经常用作处理嵌套的流。
标准语法
Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
示例
假设现在有一个年龄列表ageList
和学生信息列表studentList
,需要从studentList
中取出有年龄age
在年龄列表中的学生信息
- 不使用stream方法
使用两个for
循环,拿每一个age
和每一个学生的年龄作比较,如果符合则添加进结果中for (int age : ageList) { for (SysStudent student : studentList) { if (student.getStudentAge() == age) { resultList.add(student); } } }
- 使用stream方法
将ageList
中的age
扁平化成多个流,分别根据每个age
做过滤,如果满足条件则收集起来resultList = ageList.stream() .flatMap(age -> studentList.stream() .filter(student -> student.getStudentAge() == age)) .collect(Collectors.toList());
flatMap和map的区别
- flatMap:将流中的每个元素转换为另一个流,并将这些流合并成一个单一的流。
- map:将流中的每个元素转换为另一个对象,但不涉及流的扁平化。
我自己的理解是这样的
比如本例中,如果使用map
,则需要在后续步骤中合并成单一的流
List<List<SysStudent>> mappedResult = ageList.stream()
.map(age -> studentList.stream()
.filter(student -> student.getStudentAge() == age)
.collect(Collectors.toList()))
.collect(Collectors.toList());
resultList = mappedResult.stream()
.flatMap(List::stream)
.collect(Collectors.toList());