stream map方法_Java Stream中map和flatMap方法
最近看到一篇讲stream
语法的文章,学习Java
中map()
和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()
方法都可以应用于Stream
和Optional
对象。并且都返回Stream
或Optional
对象。区别在于map()
操作为每个输入值生成一个输出值,而flatMap()
操作为每个输入值生成任意数量(零个或多个)的输出值。
在flatMap()
中,每个输入始终是一个集合,可以是List
或Set
或Map
。
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方法相关推荐
- java中collection方法_Java 8中的Collector toCollection()方法
toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...
- java8 stream 分组_Java 8 中 Map 骚操作之 merge() 的用法
作者:LQ木头来源:http://juejin.im/post/5d9b455ae51d45782b0c1bfb Java 8 最大的特性无异于更多地面向函数,比如引入了 lambda等,可以更好地进 ...
- java map操作_Java 8 中的 Map 骚操作,学习下!
怎么用? 简介 使用场景 其他 总结 Java 8最大的特性无异于更多地面向函数,有时约会了等,可以更好地进行函数式编程. 前段时间无意间发现了方法,感觉还是很好用的,此文简单做一些相关介绍.首先我们 ...
- java for循环map赋值_Java for循环Map集合优化实现解析
这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在<for循环实战性能优化> ...
- java stream 分组求和_Java stream List 求和、分组操作
Java stream List 求和.分组操作 前言 项目中经常会使用Stream操作一些集合数据,今天记录一下我经常使用的Stream操作 求和操作public static void main( ...
- java private 接口_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- Java私有方法解释_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- stream分组计数_Java Stream:第2部分,计数始终是计数吗?
stream分组计数 在上一篇有关该主题的文章中 ,我们了解到JDK 8 stream()::count需要更长的时间来执行Stream更多的元素. 对于最新的JDK(例如Java 11),简单的流管 ...
- java的map集合_Java集合之Map
正文 Map的特点? 通过Map接口的泛型我们可以看出:Map一次添加一对元素,存储的是键值对:而Collection接口一次添加一个元素. Map接口中的key是唯一的. Map的常见方法? 1.添 ...
最新文章
- JSON入门基础知识
- [SAP成都] SAP UI5应用的sap-ui-core.js被加载之前,还有哪些js文件被加载了
- 一个简易的反射类库NMSReflector
- QtCreator与catkin命令两种方式开发ROS程序(图示加代码)
- 书籍:Python游戏开发 Game Development Using Python - 2019.pdf
- Echarts数据可视化grid直角坐标系(xAxis、yAxis),开发全解+完美注释
- 矩阵的逆、伪逆、左右逆
- ITIL 4 Foundation知识体系-第一章-介绍
- 方法重写和方法重载的区别
- 移动接入身份认证技术
- 天行健,君子以自强不息;地势坤,君子以厚德载物
- Kick Start Round A 2022
- PS证件照排版计算器
- VSCode PlatformIO IDE 下开发ESP32遇到的问题
- 浅谈char类型范围
- 淘宝iOS拍立淘微距能力探索与实现
- 笨方法学 python3进阶篇_笨办法学Python 3 进阶篇
- 什么是 Java Mission Control?它是如何工作的?
- 数据结构: 中序非递归遍历二叉树
- 数字电路实验怎么接线视频讲解_1个视频了解火灾自动报警系统联动全过程!...