map比较简单,可以抽取列表元素的某个属性形成新的列表,但是无法对更深层的属性做提取,相当于只针对一维数组,一对一的处理。
flatMap主要是对流进行扁平化,可以将一个2维的集合映射成一个一维,相当于他映射的深度比map深了一层 ,所以名称上就把map加了个flat,叫flatmap;而他针对的也是二维数组,一对多的处理。
开发时,可以使用的idea的debug看到stream的处理过程,每一步是怎么处理的。
前言
用法区别
map自动返回stream对象;
flatmap处理后的元素依然要是stream对象(可以用stream.of,Arrays.stream将元素转为stream对象),这也是flatMap和map的用法区别,flatmap需要再加一个Arrays.stream或stream.of或者方法引用,而map不用。
简单写法
1 | List<String> list = Arrays.asList("a1","a2","a3"); |
需求
比如遇到如下需求:给List<Room>
对象,需要获取到List<String> peopleNameList
对象
1 | // 解释:一个房间有自己的房间号,里面有一堆人,每个人都有名字 |
解决方案
使用Map方法
如果只是使用普通的map方法且里面是直接getPeopleList()方法,则得到的是 List<List<Room.People>> collect
对象。
1 | public class Demo { |
通常遇到这情况,一般人解决就是在遍历一次,如下:
1 | public class Demo { |
而有的人可能会在上面的基础上,再进一步优化为如下:
1 | public class Demo { |
使用flatMap
flatMap就是用于多层结构的扁平化,如下:
1 | public class Demo { |
完整代码
1 | public class Demo { |