接下来我们就来具体看一下流都有哪些操作。
1、映射 map、flatMap
map
可以帮我们从一个流中提取一个新的流,map会被应用到每个元素上,并将其映射成一个新的元素。
map代码:
//映射
List<Student> list = new ArrayList<>();
String[] names = {"小明","小华","小志","小东","小李","小张","小王","小周","小吴","小郑"};
for(int i=0; i<10; i++) {
Student student = Student.builder()
.name(names[i])
.age(12+i/5)
.no(i+1)
.math(85d+i).build();
list.add(student);
}
List<String> studentName = list.stream().map(Student::getName).collect(Collectors.toList());
System.out.println("获取学生姓名新的列表:");
studentName.forEach(System.out::println);
输出结果:
获取学生姓名新的列表:
小明
小华
小志
小东
小李
小张
小王
小周
小吴
小郑
重点在这里:map(Student::getName),我们通过学生流,用map提取每个学生的姓名,生成了新的流,最终通过collect(Collectors.toList()),生成了新的集合。
flatMap
使用flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。所有使用map(Arrays::stream)时生成的单个流都被合并起来,即扁平化为一个流。
代码:
//映射后返回的stream<String[]>
List<String[]> hello_world = Arrays.asList("Hello","Lambda").stream()
.map(x -> x.split(""))
.collect(Collectors.toList());
hello_world.forEach(x->{
for(int i=0;i<x.length;i++) {
System.out.println(x[i]);
}
});
//流的扁平化,flatMap映射后返回的stream<String>
List<String> hello_world1 = Arrays.asList("Hello Lambda").stream()
.map(x -> x.split(""))
.flatMap(Arrays::stream)
.collect(Collectors.toList());
hello_world1.forEach(System.out::println);
输出结果:
H
e
l
l
o
L
a
m
b
d
a
===============================
H
e
l
o
L
a
m
b
d
我们上面的两端代码,都是想将字符数组”Hello”,”Lambda”按字符拆分后,去重,但是第一个并不是我们想要的效果,使用map处理后,返回的stream,最终distinct相当于是对两个字符串数组进行去重,所以不能排除重复的字符;第二个在执行了map函数后,又执行了flatMap,将字符数组合并到了一起,将所有内容都装到了一个数组中,这时就可以对字符进行去重了,核心方法就是这里:flatMap(Arrays::stream)。