map:只能返回一个值

flatmap:返回多个值

new ArrayList().stream().map(x -> x);//返回一个
new ArrayList().stream().flatMap(x -> Arrays.asList(x.split(" ")).stream());//返回一个流,也就是多个值

看API声明可以发现,flatmap接受的参数是流类型,map接受的非流类型,flatmap会把结果中的所有流的所有元素合并起来。

问题

假如我们有这样一个需求给定单词列表[“Hello”,“World”],你想要返回列表[“H”,“e”,“l”, “o”,“W”,“r”,“d”],如果我们使用java实现这个需求,你会怎么实现呢?可能我们第一个想法是下面这种写法:

words.stream()
.map(word -> word.split(""))
.distinct()
.collect(toList());

但是如果我们运行会发现这样的写法是不正确的,这个方法的问题在于,传递给map方法的Lambda为每个单词返回了一个String[](String列表)。因此, map 返回的流实际上是Stream 类型的。你真正想要的是用
Stream来表示一个字符流。因此,这是行不通的。

我们带着上面的问题进行下面的分析:

map和flatmap的区别

map:对于stream中包含的元素使用 特定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是mapToInt,mapToLong和mapToDouble.这三个方法比较好理解,比如mapToInt就是把原始的Stream转换成一个新的Stream,这个新生成的Stream中的元素map方法示意图:

flatMap:和map类似,不同的是每个元素 转换得到是Stream对象,会把子Stream中的元素压缩到父集合中:

flatMap方法示意图:

如果我们用一句话来总结flatmap:

把几个小的list转换成一个大的list

解决问题:

对于我们开始提出的问题,我们分为两步来完成:

1、分隔字符串,将数据中的字母都分隔开,形成多个小list新的stream

2、组装成新的list

        String[] strings = {"Hello", "World"};List<String> collect = Stream.of(strings).map(s -> s.split("")).flatMap(s -> Stream.of(s)).distinct().collect(Collectors.toList());collect.forEach(c->{System.out.println(c);});

这样我们就可以很好地理解map和flatmap的区别了

java8中的map与flatmap区别相关推荐

  1. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  2. java8 flatmap与map_java8中map和flatMap区别

    1.函数定义比较 map注释: /** * Returns a stream consisting of the results of applying the given * function to ...

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

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

  4. 谈谈 Swift 中的 map 和 flatMap

    map 和 flatMap 是 Swift 中两个常用的函数,它们体现了 Swift 中很多的特性.对于简单的使用来说,它们的接口并不复杂,但它们内部的机制还是非常值得研究的,能够帮助我们够好的理解 ...

  5. RxJava 中的map与flatMap

    1.map和flatMap都是接受一个函数作为参数(Func1) 2.map函数只有一个参数,参数一般是Func1,Func1的<I,O>I,O模版分别为输入和输出值的类型,实现Func1 ...

  6. spark RDD 的map与flatmap区别说明(转)

    转载前备注: 下面的实验全部在spark-shell中运行即可 #------------------------------------------------------------------- ...

  7. Optional 中的 map 和 flatMap

    在面试的时候,面试官问了我一个问题.你使用过 Optional 吗?Optional 的原理是什么?我一听,这还不简单.Optional是一个枚举. public enum Optional<W ...

  8. Java 8 Stream Api 中的 map和 flatMap 操作

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1.前言 Java 8  ...

  9. map and flatmap 区别

    2019独角兽企业重金招聘Python工程师标准>>> map vs flatMap in Spark September 24, 2014Big Dataexample, spar ...

最新文章

  1. jQuery-基本选择器的种类
  2. 51. ExtJs4之Ext.util.JSON编码和解码JSON对象
  3. Spring框架第二天知识总结
  4. javascript --- 堆栈内存与闭包的作用
  5. zabbix监控suse linux,SuSE 系统之部署 Zabbix 监控服务
  6. linux定时任务的用法详解
  7. Struts2 转换器
  8. jQuery迷你帮助查找功能
  9. 进程占用过高cpu的排查
  10. 爬取百度贴吧发帖信息并保存到scv文件中
  11. 火山视频去水印,无水印视频解析原理及实现
  12. 何通过ArcCatalog本地发布地图服务
  13. 信息资源管理【二】之 信息化规划与组织
  14. 数据库系统原理——实验一
  15. OSChina 周日乱弹 ——书中自有颜如玉
  16. python语言是干什么的-python语言可以干什么
  17. matlab要掌握什么,学习matlab需要什么基础?
  18. 显示器会影响电脑的显示效果么
  19. 重磅!《新一代人工智能伦理规范》发布丨附全文
  20. 实时获取Android手机CPU频率

热门文章

  1. spool导出姓名中文乱码_MySQL不同字符集转化标准—7步实现,杜绝乱码!
  2. kotlin中判断字符串_Kotlin程序删除字符串中所有出现的字符
  3. c#异常处理_C#异常处理能力问题和解答 套装4
  4. Android8内测申请,小米 6 安卓 8.0 来了 内测开始招募
  5. win7变成xp风格了怎么改回_XP退役了,如何把Win7变成XP风格
  6. Java Collections BinarySearch()方法与示例
  7. SpringCloud Ribbon中的7种负载均衡策略!
  8. 2019年总结 | 31岁,不过是另一个开始
  9. Sql Server常用时间段查询汇总
  10. 关于怎么获取jsp的web站点的目录问题