Java 8 提供了很是好用的 Stream API ,能够很方便的操做集合。今天咱们来探讨两个 Stream 中间操做 map(Function
mapper)
和 flatMap(Function
> mapper)
html
map
操做是将流中的元素进行再次加工造成一个新流。这在开发中颇有用。好比咱们有一个学生集合,咱们须要从中提取学生的年龄以分析学生的年龄分布曲线。放在 Java 8 以前 咱们要经过新建一个集合而后经过遍历学生集合来消费元素中的年龄属性。如今咱们经过很简单的流式操做就完成了这个需求。java
示意图:api
对应的伪代码:app
// 伪代码
List<Integer> ages=studentList.stream().map(Student::getAge).collect(Collectors.toList());复制代码
经过上面的例子,map
操做应该很是好理解。那么 flatMap
是干吗的呢? 这样咱们把上面的例子给改一下,若是是以班级为单位,提取全部班级下的全部学生的年龄以分析学生的年龄分布曲线。这时咱们使用上面的方法还行得通吗?spa
List<List<Student>> studentGroup= gradeList.stream().map(Grade::getStudents).collect(Collectors.toList());复制代码
经过上面的一顿操做,咱们只能获得每一个班的学生集合的集合 List
。 咱们还须要嵌套循环才能获取学生的年龄数据,十分不便。若是咱们能返回所有学生的集合
List
就方便多了。 没错!flatMap
能够搞定!3d
// flatMap 提取 List<Students> map 提取年龄
List<Integer> ages = grades.stream().flatMap(grade -> grade.getStudents().stream()).map(Student::getAge).collect(Collectors.toList());复制代码
正如上面的伪代码所示,咱们使用 flatMap
将全部的学生汇聚到一块儿。而后再使用 map
操做提取年龄。 flatMap
不一样于 map
地方在于 map
只是提取属性放入流中,而 flatMap 先提取属性放入一个比较小的流,而后再将全部的流合并为一个流。有一种 “积少成多” 的感受。code
再画一张图来加深理解:cdn
map
操做和 flatMap
操做一旦你熟悉了,能够很是简便地解决一些数据流的操做问题。扩展一下知识,其实Java 8 中 不光 Stream 中存在这两种操做,其实 Optional
中也存在这两种操做,做用都差很少。htm
关注公众号:Felordcn获取更多资讯
blog