flatMap
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
返回由通过将提供的映射函数应用于每个元素而产生的映射流的内容来替换该流的每个元素的结果的流。 每个映射的流在其内容被放入此流之后是closed 。 (如果映射的流是
null
则使用空的流)。
flatMap()
操作具有对流的元素应用一对多变换,然后将所得到的元素平坦化为新流的效果参数类型
R
- 新流的元素类型参数
mapper
-一个 non-interfering , stateless功能应用到其产生新的值的流的每个元素结果
新的流(和原来流中元素一对多映射)
例子
获取所有学生的兴趣爱好(也可以做去重之类的处理)
import lombok.Data;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
List<String> hobby1 = Stream.of("java", "c", ".net").collect(Collectors.toList());
List<String> hobby2 = Stream.of("c++", "c", "php").collect(Collectors.toList());
Student a = new Student(1, "AAA", (short) 13);
Student b = new Student(1, "BBB", (short) 13);
a.setHobby(hobby1);
b.setHobby(hobby2);
List<String> collect2 = Stream.of(a, b).map(x -> x.getHobby()).flatMap(Collection::stream).collect(Collectors.toList());
System.out.println(collect2);
}
@Data
static class Student {
Integer gradeId;
String name;
Short age;
List<String> hobby;
public Student(Integer gradeId, String name, Short age) {
this.gradeId = gradeId;
this.name = name;
this.age = age;
}
}
}
结果
[java, c, .net, c++, c, php]
PS: 依次类推,也可以做订单流下面多个商品的集合
比如:
orders
是采购订单流,并且每个采购订单都包含订单项的集合,则以下生成包含所有订单中所有订单项的流
orders.flatMap(order -> order.getLineItems().stream())
map
<R> Stream<R> map(Function<? super T,? extends R> mapper)返回由给定函数应用于此流的元素的结果组成的流
参数类型
R
- 新流的元素类型参数
mapper
-一个 non-interfering , stateless函数应用到每个元件结果
新的流(和原来流中元素一对一映射)
例子
import lombok.Data;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Student a = new Student(1, "AAA", (short) 13);
Student b = new Student(1, "BBB", (short) 13);
List<String> collect2 = Stream.of(a, b).map(x -> x.getName()).collect(Collectors.toList());
System.out.println(collect2);
}
@Data
static class Student {
Integer gradeId;
String name;
Short age;
List<String> hobby;
public Student(Integer gradeId, String name, Short age) {
this.gradeId = gradeId;
this.name = name;
this.age = age;
}
}
}
结果
[AAA, BBB]
总结:
两者都会产生新流,但是flat是一对多的映射关系,map是一对一的映射关系,执行次数都是原流中元素的个数