java8中的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的区别了
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135984.html原文链接:https://javaforall.cn
相关文章
- JSONObject转换为Map<String, String>对象「建议收藏」
- Java 常用Set集合和常用Map集合
- mybatis map foreach_while的三个用法
- 一眼看懂map和flatmap的区别
- java 把对象转成map_Java对象转换成Map[通俗易懂]
- 【说站】java Map如何进行转换
- JAVA对象转map_java处理字符串类型的map
- Map和Set的区别_list与set的区别
- python中的map和filter避坑指南
- 数组的Map方法详解
- C++map的遍历_Map集合循环遍历的几种方式
- map key为null_mybatis json
- MySQL Error number: MY-010625; Symbol: ER_NDB_WAITING_INFO_WITH_MAP; SQLSTATE: HY000 报错 故障修复 远程处理
- js模仿java的Map集合,实现功能详解编程语言
- 《Drools7.0.0.Final规则引擎教程》番外实例篇——Map使用案例详解编程语言
- 使用Redis轻松操作Map数据结构(redis操作map)
- 集Oracle中存储Map集的新方法(oracle保存map)
- 科学上网如何使用Oracle MAP(oracle map使用)
- 学会调整Redis中Map容量的设置(redis设置map大小)
- Redis批量获取多个Map(redis获取多个map)
- Redis脚本快速遍历Map集(redis脚本遍历map)
- JS自定义对象实现Java中Map对象功能的方法