最近看到一篇讲stream语法的文章,学习Javamap()flatMap()方法之间的区别。

虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里。

通过演示Demo中的代码可以了解map()flatMap()的具体功能差异。

  • 首先来一段简单的stream语法foreach方法的用法

演示Demo:

        List funs = Arrays.asList("F", "U", "N");        funs.stream().forEach(x -> output(x));

控制台输出:

INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.7FUN

Process finished with exit code 0

map方法

map()是一个中间操作,这意味着它返回Stream对象。

  • 先来一个简单

演示Demo:

        List funs = Arrays.asList("F", "U", "N");        funs.stream().map(x->x+"001").forEach(x->output(x));

控制台输出:

INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.7INFO-> fINFO-> uINFO-> nINFO-> F001INFO-> U001INFO-> N001java.util.stream.ReferencePipeline$3@27ae2fd0java.util.stream.ReferencePipeline$3@29176cc1

Process finished with exit code 0

  • 再来一个复杂的

演示Demo:

        List fun1 = Arrays.asList("one", "two", "three");        List fun2 = Arrays.asList("four", "five", "six");        List> nestedList = Arrays.asList(fun1, fun2);        nestedList.stream().map(x -> {return x.stream().map(a -> a.toUpperCase());        }).forEach(x -> output(x));

控制台输出:

INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.7INFO-> java.util.stream.ReferencePipeline$3@45018215INFO-> java.util.stream.ReferencePipeline$3@30b7c004

显然,在最后一步输出的时候,x是一个stream的对象,而不是一个list对象。

当我们尝试从List>获取值进行操作时,map()无法如预期一样工作,需要进行修改才能从嵌套的List>对象获取字符串值。

如下:

        List fun1 = Arrays.asList("one", "two", "three");        List fun2 = Arrays.asList("four", "five", "six");        List> nestedList = Arrays.asList(fun1, fun2);        nestedList.stream().map(x -> {return x.stream().map(a -> a.toUpperCase());        }).forEach(x ->x.forEach(a->output(a)));

控制台输出:

INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.7INFO-> ONEINFO-> TWOINFO-> THREEINFO-> FOURINFO-> FIVEINFO-> SIX

Process finished with exit code 0

flatMap方法

让我们在上述代码中将map()更改为flatMap(),然后查看输出。

  • 先来一个简单

演示Demo:

        List fun1 = Arrays.asList("one", "two", "three");        List fun2 = Arrays.asList("four", "five", "six");        List> nestedList = Arrays.asList(fun1, fun2);        nestedList.stream().flatMap(x -> x.stream()).map(x->x.toUpperCase()).forEach(x -> output(x));

控制台输出:

INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.7INFO-> ONEINFO-> TWOINFO-> THREEINFO-> FOURINFO-> FIVEINFO-> SIX

Process finished with exit code 0

相当于在.flatMap(x -> x.stream())这个时候我们把x.stream()返回的stream对象合并成了一个新的stream对象。这一点在Stream类的方法注释中找到了印证。

  /**  ·····     * @return the new stream     */     Stream flatMap(Function super T, ? extends Stream extends R>> mapper);

Java 8 map()与flatMap()

map()flatMap()方法都可以应用于StreamOptional对象。并且都返回StreamOptional对象。区别在于map()操作为每个输入值生成一个输出值,而flatMap()操作为每个输入值生成任意数量(零个或多个)的输出值。

flatMap()中,每个输入始终是一个集合,可以是ListSetMap

map()操作采用一个方法,该方法针对输入流中的每个值调用,并生成一个结果值,该结果值返回至stream

flatMap()操作采用的功能在概念上消耗一个集合对象并产生任意数量的值。但是在Java中方法返回任意数目的值很麻烦,因为方法只能返回void或一个对象。

演示Demo:

        List fun1 = Arrays.asList("one", "two", "three");        List fun2 = Arrays.asList("four", "five", "six");        Stream.of(fun1,fun2).flatMap(List::stream).forEach(Output::output);

控制台输出:

INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.7INFO-> oneINFO-> twoINFO-> threeINFO-> fourINFO-> fiveINFO-> six

Process finished with exit code 0


公众号FunTester首发,原创分享爱好者,腾讯云和掘金社区首页推荐,知乎七级原创作者,欢迎关注、交流,禁止第三方擅自转载。

FunTester热文精选

  • 写给所有人的编程思维
  • 2020年Tester自我提升
  • 未来的神器fiddler Everywhere
  • 测试开发工程师工作技巧
  • Selenium4 IDE,它终于来了
  • 自动化测试灵魂三问:是什么、为什么和做什么
  • 为什么测试覆盖率如此重要
  • 吐个槽,非测勿入。
  • 自动化测试框架
  • 敏捷中的端到端测试

stream map方法_Java Stream中map和flatMap方法相关推荐

  1. java中collection方法_Java 8中的Collector toCollection()方法

    toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...

  2. java8 stream 分组_Java 8 中 Map 骚操作之 merge() 的用法

    作者:LQ木头来源:http://juejin.im/post/5d9b455ae51d45782b0c1bfb Java 8 最大的特性无异于更多地面向函数,比如引入了 lambda等,可以更好地进 ...

  3. java map操作_Java 8 中的 Map 骚操作,学习下!

    怎么用? 简介 使用场景 其他 总结 Java 8最大的特性无异于更多地面向函数,有时约会了等,可以更好地进行函数式编程. 前段时间无意间发现了方法,感觉还是很好用的,此文简单做一些相关介绍.首先我们 ...

  4. java for循环map赋值_Java for循环Map集合优化实现解析

    这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在<for循环实战性能优化> ...

  5. java stream 分组求和_Java stream List 求和、分组操作

    Java stream List 求和.分组操作 前言 项目中经常会使用Stream操作一些集合数据,今天记录一下我经常使用的Stream操作 求和操作public static void main( ...

  6. java private 接口_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  7. Java私有方法解释_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  8. stream分组计数_Java Stream:第2部分,计数始终是计数吗?

    stream分组计数 在上一篇有关该主题的文章中 ,我们了解到JDK 8 stream()::count需要更长的时间来执行Stream更多的元素. 对于最新的JDK(例如Java 11),简单的流管 ...

  9. java的map集合_Java集合之Map

    正文 Map的特点? 通过Map接口的泛型我们可以看出:Map一次添加一对元素,存储的是键值对:而Collection接口一次添加一个元素. Map接口中的key是唯一的. Map的常见方法? 1.添 ...

最新文章

  1. JSON入门基础知识
  2. [SAP成都] SAP UI5应用的sap-ui-core.js被加载之前,还有哪些js文件被加载了
  3. 一个简易的反射类库NMSReflector
  4. QtCreator与catkin命令两种方式开发ROS程序(图示加代码)
  5. 书籍:Python游戏开发 Game Development Using Python - 2019.pdf
  6. Echarts数据可视化grid直角坐标系(xAxis、yAxis),开发全解+完美注释
  7. 矩阵的逆、伪逆、左右逆
  8. ITIL 4 Foundation知识体系-第一章-介绍
  9. 方法重写和方法重载的区别
  10. 移动接入身份认证技术
  11. 天行健,君子以自强不息;地势坤,君子以厚德载物
  12. Kick Start Round A 2022
  13. PS证件照排版计算器
  14. VSCode PlatformIO IDE 下开发ESP32遇到的问题
  15. 浅谈char类型范围
  16. 淘宝iOS拍立淘微距能力探索与实现
  17. 笨方法学 python3进阶篇_笨办法学Python 3 进阶篇
  18. 什么是 Java Mission Control?它是如何工作的?
  19. 数据结构: 中序非递归遍历二叉树
  20. 数字电路实验怎么接线视频讲解_1个视频了解火灾自动报警系统联动全过程!...

热门文章

  1. Python zip() 函数
  2. Java基本数据之间的类型转换
  3. 多平台Gstreamer Multiplatform
  4. CVPR2020:训练多视图三维点云配准
  5. 地面标识检测与识别算法
  6. HarmonyOS Unknown HarmonyOS XML attribute
  7. python 删除字符串中重复的元素
  8. git生成ssh keys步骤与使用
  9. RxPermissions的简单应用
  10. 线段树——HDU - 1698