Stream流中map与flatMap区别|转
map和flatMap都是对流中的每一个元素,执行入参中的函数式方法,只是在函数式方法的返回值上有区别:
- map中函数式方法返回值为对象,也就是原始流中有n个元素,处理之后的流中元素个数也是n。即使你在返回的时候返回了多个元素如数组,它也会把数组当成一个对象处理。
- flatMap中函数式方法返回值为流,flat为扁平的意思,也就是说,我们可以通过flatMap改变原始流中对象的个数,flatMap会将返回的流合并成一个流,而不是当成对象处理。
通过一个简单的例子来理解:假设有一个数组1,2,3,4,5,需要对其每个元素进行处理,当值为偶数时,则返回双个,也就是结果为:1,2,2,3,4,4,5,这个时候就需要使用flatMap来处理。我们可以通过下面的示意图及代码体验一下区别:

public class FlatMapTest {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
List<Object> res1 = nums.stream().map(e -> {
if (e % 2 == 0) {
return Arrays.asList(e, e);
} else {
return e;
}
}).collect(Collectors.toList());
List<Object> res2 = nums.stream().flatMap(e -> {
if (e % 2 == 0) {
return Stream.of(e, e);
} else {
return Stream.of(e);
}
}).collect(Collectors.toList());
System.out.println(res1);
System.out.println(res2);
}
}
执行结果:
[1, [2, 2], 3, [4, 4], 5]
[1, 2, 2, 3, 4, 4, 5]
Reference
Stream流中map与flatMap区别|转的更多相关文章
- JDK 8 中Stream流中的去重的方法
JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...
- 【JDK8】JDK 8 中Stream流中的去重的方法
JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...
- Stream流的特点_只能使用一次和Stream流中的常用方法_map
Stream流的特点_只能使用一次 public class FilterStudy04 { public static void main(String[] args) { //创建一个Stream ...
- Stream流的特点_只能用一次-Stream流中的常用方法_map
Stream流的特点_只能用一次 Stream流属于管道流,只能被消费(使用)一次 第一个stream流调用完毕方法,数据就会流转到下一个stream上 而这时第一个stream流已经使用完毕,就会关 ...
- Stream流中的常用方法foeEach和Stream流中的常用方法filter
延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...
- Stream流中的常用方法_skip-Stream流中的常用方法_concat
Stream流中的常用方法_skip 如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流∶ 如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流.基本使用: Strea ...
- Stream流中的常用方法_Foreach-Stream流中的常用方法_filter
Stream流中的常用方法_Foreach 流模型的操作很丰富,这里介绍一些常用的API.这些方法可以被分成两种︰·延迟方法∶返回值类型仍然是Stream,接口自身类型的方法,因此支持链式调用.(除了 ...
- java stream map和 flatmap区别
区别:map mapper返回R,flatMap mapper返回Stream<R> 官网解释 1,<R>Stream<R> flatMap(Function< ...
- spark中map与flatMap的区别
作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...
- Spark中map与flatMap
map将函数作用到数据集的每一个元素上,生成一个新的分布式的数据集(RDD)返回 map函数的源码: def map(self, f, preservesPartitioning=False): &q ...
随机推荐
- 关于我在使用Steamlit中碰到的问题及解决方案总结
Steamlit 并不支持一个可以预览本地文件的路径选择器(并不上传文件) 解决方案:使用 Python 自带的 tkinter 来完成 参考:[Streamlit 选择文件夹的曲折方案]Stream ...
- php服务器如何验证令牌
在PHP中,令牌通常用于防止跨站请求伪造(CSRF)攻击.以下是一个简单的例子,展示了如何生成和验证令牌: 生成令牌: function generateToken($length = 32) { / ...
- Linux 下如何修改密码有效期?
有时我们连接远程服务器的时候,提示密码过期,需要修改密码才能登录,这时可以用chage命令来调整下用户密码的有效期,使用户可以继续使用. chage命令 chage命令用于查看以及修改用户密码的有效期 ...
- Linux SWAP交换分区应该设置多大?
乾乾君子 2019-02-21 15:21:02 23370 收藏 34分类专栏: 杂记 文章标签: linux centos swap分区版权 Linux SWAP交换分区,就是我们课本说讲过 ...
- ISO9126
ISO9126 软件质量模型是评价软件质量的国际标准,由6个特性和27个子特性组成. 中文名 软件质量模型 外文名 ISO9126 属 于 软件产品评价-质量特性 层 次 质量特性 ...
- 交换机批量配置生成器(SecureCRT vbs脚本)
交换机批量配置生成器(SecureCRT vbs脚本) QQ交流群:(4817315) 一.工具介绍 本工具主要是针对简化网络工程师重复繁琐的工作而开发.工具只是将重复工作通过自己配置生成脚本代码来执 ...
- base64编码与一般的ASCII码和二进制编码有什么不同?base64详解
在密码学实践中,经常会用到Base64编码.比如大名鼎鼎的密码学挑战题"Matasano Crypto Challenges"的第一集合的第一题,就是要求把一个Hex编码的字符串转 ...
- 基于.NetCore开发 StarBlog 番外篇 (1) StarBlog Publisher,跨平台一键发布,DeepSeek加持的文章创作神器
前言 我一直在优化发布文章的工作流 之前的 StarBlog 已经支持文章打包上传(将 Markdown 和图片文件一并打包为 ZIP 格式上传),但还是有不少步骤,重复的次数多了,还是感觉麻烦. 为 ...
- Maven导包报错Could not resolve dependencies for projectXXX was cached in the local repository....
问题 将项目和maven仓库一起拿到了内网环境,一直报错无法解析依赖was cached in the local repository, resolution will not be reattem ...
- idea插件开发踩坑记录
问题 build.gradles.kts配置文件中全部爆红,提示Cannot access script base class 'org.gradle.kotlin.dsl.KotlinBuildSc ...