点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

来源 | 公众号「码农小胖哥」

1.前言

Java 8 提供了非常好用的  Stream API ,可以很方便的操作集合。今天我们探讨两个 Stream 中间操作 map 和 flatMap

2. map 操作

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

示意图:

对应的伪代码:

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

3. flatMap 操作

通过上面的例子,map 操作应该非常好理解。那么 flatMap 是干嘛的呢? 这样我们把上面的例子给改一下,如果是以班级为单位,提取所有班级下的所有学生的年龄以分析学生的年龄分布曲线。这时我们使用上面的方法还行得通吗?

 List<List<Student>> studentGroup= gradeList.stream().map(Grade::getStudents).collect(Collectors.toList());

通过上面的一顿操作,我们只能得到每个班的学生集合的集合 List<List<Student>>。 我们还需要嵌套循环才能获取学生的年龄数据,十分不便。如果我们能返回全部学生的集合 List<Students> 就方便多了。 没错!flatMap 可以搞定!

 // 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 先提取属性放入一个比较小的流,然后再将所有的流合并为一个流。有一种 “聚沙成塔” 的感觉。

再画一张图来加深理解:

4. 总结

map 操作和 flatMap 操作一旦你熟悉了,可以非常简便地解决一些数据流的操作问题。扩展一下知识,其实Java 8 中 不光 Stream 中存在这两种操作,其实 Optional<T> 中也存在这两种操作,作用都差不多。

本文通过OpenWrite的Markdown转换工具发布

关注我,回复“加群”加入各种主题讨论群

  • 阿里内部禁用Executors创建线程池,为什么?

  • Token ,Cookie、Session傻傻分不清楚?

  • 使用 LocalDateTime 而不是 Date

  • 深入解读阿里云Redis开发规范:不要只会set&get

  • 在服务器上排除问题的头 5 分钟

朕已阅 

Java 8 Stream Api 中的 map和 flatMap 操作相关推荐

  1. java8 stream to map_Java 8 Stream Api 中的 map和 flatMap 操作

    1.前言 Java 8 提供了非常好用的 Stream API ,可以很方便的操作集合.今天我们来探讨两个 Stream 中间操作 map 和 flatMap 2. map 操作 map 操作是将流中 ...

  2. Java 8 Stream Api 中的 skip 和 limit 操作

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 Java 8 Stream API 中的sk ...

  3. Java 8 Stream Api 中的 peek、map、foreach区别

    #1. 前言 我在Java8 Stream中讲述了 Java 8 Stream API 的一些内容.今天再看一下peek.map.foreach区别. 2. peek peek 操作接收的是一个 Co ...

  4. java peek函数_Java 8 Stream Api 中的 peek 操作

    1. 前言 我在 Java 8 Stream API中的 map 和flatMap 中讲述了Java8 Stream API中 map 操作和 flatMap 操作的区别.然后有小伙伴告诉我 peek ...

  5. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...

  6. Java 8 Stream API详解

    Java 8 Stream API详解 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStrea ...

  7. java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...

    详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...

  8. stream去重_使用Java Stream API中DistinctBy删除重复数据

    Stream API提供distinct()方法,该方法基于数据Object类的equals()方法返回列表的不同元素.下面先做一个数据Object类,用来发现重复数据: public class L ...

  9. Java 8 Stream API学习记录

    Stream简介 1.Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. 2.stream是对集合对象功能的 ...

最新文章

  1. CoordinatorLayout+AppBarLayout顶部栏吸顶效果
  2. leetcode 18 -- 4Sum
  3. vue 初始化方法_Vue源码解读(一)引入Vue做了什么
  4. linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...
  5. 部署Windows Server Update Services 4.0
  6. [Hands On ML] 3. 分类(MNIST手写数字预测)
  7. 阿里云的SLB,植入cookie和重写cookie有什么区别?
  8. 数据:以太坊2.0合约余额新增1.52万ETH
  9. 引用和使用引用传递参数《二》
  10. oracle查询多个加锁,解析oracle对select加锁的方法以及锁的查询 转
  11. 2019 互联网月饼哪家强?阿里走情怀;百度最土豪;浪潮最高冷;抖音最.........
  12. 非度量多维标度_R软件包vegan教程 2.1非度量多维度标度变换
  13. Word2010页眉添加两条横线
  14. Dragonfly 修改数据像素点大小
  15. Ubuntu系统下的实用软件推荐
  16. 软件测试工作怎样修改本机IP,如何在命令行下更改IP地址
  17. 我的世界斗罗封神服务器怎么注册,我的世界斗罗封神服务器-我的世界斗罗封神mod手机版v1.17.2.01-游戏宝手游网...
  18. 平板电脑取代PC是大势所趋?
  19. 若要运行此应用程序,您必须首先安装,NET Framework的以下版本之一(附链接)
  20. layui列表显示缩略图_layui 表格中实现照片预览,点击查看原图

热门文章

  1. web 容器 Jetty 简介
  2. python3 字符串填充 清除
  3. mysql 计算两个日期之间的天数
  4. linux 内核 netfilter 网络过滤模块 (3)-NAT
  5. RDTSC汇编指令详解
  6. SecureCRT中文绿色免安装版修改字体颜色
  7. PHP 中华如何用命令连接数据库,选择MySQL数据库的命令以及PHP脚本下的操作方法...
  8. 算法 - 交换排序(C++)
  9. wpf listview mysql_Kivy:使用MySQL的Kivy页面的Listview实现
  10. html语言剖析,HTML语言剖析(十三) 其他标记