Java 8 Stream Api 中的 map和 flatMap 操做

1.前言

Java 8 提供了很是好用的 Stream API ,能够很方便的操做集合。今天咱们来探讨两个 Stream 中间操做 map(Function mapper)flatMap(Function > mapper)html

2. map 操做

map 操做是将流中的元素进行再次加工造成一个新流。这在开发中颇有用。好比咱们有一个学生集合,咱们须要从中提取学生的年龄以分析学生的年龄分布曲线。放在 Java 8 以前 咱们要经过新建一个集合而后经过遍历学生集合来消费元素中的年龄属性。如今咱们经过很简单的流式操做就完成了这个需求。java

示意图:api

stream map 操做

对应的伪代码:app

// 伪代码
 List<Integer> ages=studentList.stream().map(Student::getAge).collect(Collectors.toList());复制代码

3. flatMap 操做

经过上面的例子,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

flatmap

4. 总结

map 操做和 flatMap 操做一旦你熟悉了,能够很是简便地解决一些数据流的操做问题。扩展一下知识,其实Java 8 中 不光 Stream 中存在这两种操做,其实 Optional 中也存在这两种操做,做用都差很少。htm

关注公众号:Felordcn获取更多资讯blog

我的博客:https://felord.cn

相关文章
相关标签/搜索