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区别|转的更多相关文章

  1. JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  2. 【JDK8】JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  3. Stream流的特点_只能使用一次和Stream流中的常用方法_map

    Stream流的特点_只能使用一次 public class FilterStudy04 { public static void main(String[] args) { //创建一个Stream ...

  4. Stream流的特点_只能用一次-Stream流中的常用方法_map

    Stream流的特点_只能用一次 Stream流属于管道流,只能被消费(使用)一次 第一个stream流调用完毕方法,数据就会流转到下一个stream上 而这时第一个stream流已经使用完毕,就会关 ...

  5. Stream流中的常用方法foeEach和Stream流中的常用方法filter

    延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...

  6. Stream流中的常用方法_skip-Stream流中的常用方法_concat

    Stream流中的常用方法_skip 如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流∶ 如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流.基本使用: Strea ...

  7. Stream流中的常用方法_Foreach-Stream流中的常用方法_filter

    Stream流中的常用方法_Foreach 流模型的操作很丰富,这里介绍一些常用的API.这些方法可以被分成两种︰·延迟方法∶返回值类型仍然是Stream,接口自身类型的方法,因此支持链式调用.(除了 ...

  8. java stream map和 flatmap区别

    区别:map mapper返回R,flatMap mapper返回Stream<R> 官网解释 1,<R>Stream<R> flatMap(Function< ...

  9. spark中map与flatMap的区别

    作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...

  10. Spark中map与flatMap

    map将函数作用到数据集的每一个元素上,生成一个新的分布式的数据集(RDD)返回 map函数的源码: def map(self, f, preservesPartitioning=False): &q ...

随机推荐

  1. 关于我在使用Steamlit中碰到的问题及解决方案总结

    Steamlit 并不支持一个可以预览本地文件的路径选择器(并不上传文件) 解决方案:使用 Python 自带的 tkinter 来完成 参考:[Streamlit 选择文件夹的曲折方案]Stream ...

  2. php服务器如何验证令牌

    在PHP中,令牌通常用于防止跨站请求伪造(CSRF)攻击.以下是一个简单的例子,展示了如何生成和验证令牌: 生成令牌: function generateToken($length = 32) { / ...

  3. Linux 下如何修改密码有效期?

    有时我们连接远程服务器的时候,提示密码过期,需要修改密码才能登录,这时可以用chage命令来调整下用户密码的有效期,使用户可以继续使用. chage命令 chage命令用于查看以及修改用户密码的有效期 ...

  4. Linux SWAP交换分区应该设置多大?

    乾乾君子 2019-02-21 15:21:02 23370 收藏 34分类专栏: 杂记 文章标签: linux centos swap分区版权    Linux SWAP交换分区,就是我们课本说讲过 ...

  5. ISO9126

    ISO9126 软件质量模型是评价软件质量的国际标准,由6个特性和27个子特性组成.     中文名 软件质量模型 外文名 ISO9126 属    于 软件产品评价-质量特性 层    次 质量特性 ...

  6. 交换机批量配置生成器(SecureCRT vbs脚本)

    交换机批量配置生成器(SecureCRT vbs脚本) QQ交流群:(4817315) 一.工具介绍 本工具主要是针对简化网络工程师重复繁琐的工作而开发.工具只是将重复工作通过自己配置生成脚本代码来执 ...

  7. base64编码与一般的ASCII码和二进制编码有什么不同?base64详解

    在密码学实践中,经常会用到Base64编码.比如大名鼎鼎的密码学挑战题"Matasano Crypto Challenges"的第一集合的第一题,就是要求把一个Hex编码的字符串转 ...

  8. 基于.NetCore开发 StarBlog 番外篇 (1) StarBlog Publisher,跨平台一键发布,DeepSeek加持的文章创作神器

    前言 我一直在优化发布文章的工作流 之前的 StarBlog 已经支持文章打包上传(将 Markdown 和图片文件一并打包为 ZIP 格式上传),但还是有不少步骤,重复的次数多了,还是感觉麻烦. 为 ...

  9. 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 ...

  10. idea插件开发踩坑记录

    问题 build.gradles.kts配置文件中全部爆红,提示Cannot access script base class 'org.gradle.kotlin.dsl.KotlinBuildSc ...