java8中 map和flatmap的理解
假如我们有这样一个需求给定单词列表["Hello","World"],你想要返回列表["H","e","l", "o","W","r","d"],
对于这样的需求,我们可能想到的第一个版本可能是这样子的:
words.stream()
.map(word -> word.split(""))
.distinct()
.collect(toList());
这个方法的问题在于,传递给map方法的Lambda为每个单词返回了一个String[](String
列表)。因此, map 返回的流实际上是Stream<String[]> 类型的。你真正想要的是用
Stream<String>来表示一个字符流。因此,这是行不通的。
以下是我对这个问题的解法和分步写法,希望能对你有帮助:
String ss = "Hello"; String[] aa = ss.split(""); String[] bb = {"H", "e", "l", "l", "o"}; String[] strings = {"Hello", "World"}; //Arrays.stream接收一个数组返回一个流
List<Stream<String>> streamList = Arrays.asList(strings).stream().
map(str -> str.split("")).
map(str -> Arrays.stream(str)).
collect(Collectors.toList()); //分步写(map) Stream<String[]> stream = Arrays.asList(strings).stream().
map(str -> str.split("")); Stream<Stream<String>> streamStream = stream.map(strings1 -> Arrays.stream(strings1));
List<Stream<String>> streamList1 = streamStream.collect(Collectors.toList()); List<String> stringList = Arrays.asList(strings).stream().
map(str -> str.split("")).
flatMap(str -> Arrays.stream(str))
.collect(Collectors.toList()); //分步写(流只能消费一次)(flatMap)
Stream<String[]> stream1 = Arrays.asList(strings).stream().
map(str -> str.split("")); Stream<String> stringStream = stream1.flatMap(strings1 -> Arrays.stream(strings1)); List<String> stringList1 = stringStream.collect(Collectors.toList()); 对flatMap的说明:这个在这里的主要作用是对流进行扁平化
最后给大家推荐一个专栏,http://gk.link/a/10fxp
java8中 map和flatmap的理解的更多相关文章
- java8中map的meger方法的使用
java8中map有一个merge方法使用示例: /** * 打印出包含号码集的label的集合 * * @param args */ public static void main(String[] ...
- java8中stream的map和flatmap的理解
转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...
- 理解Swift中map 和 flatMap对集合的作用
map和flatMap是函数式编程中常见的概念,python等语言中都有.借助于 map和flapMap 函数可以非常轻易地将数组转换成另外一个新数组. map函数可以被数组调用,它接受一个闭包作为參 ...
- spark中map与flatMap的区别
作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...
- (转)scala中map与flatMap浅析
在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好 ...
- Spark中map与flatMap
map将函数作用到数据集的每一个元素上,生成一个新的分布式的数据集(RDD)返回 map函数的源码: def map(self, f, preservesPartitioning=False): &q ...
- Java8中Map的遍历方式总结
在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map< ...
- 【Android】RxJava的使用(三)转换——map、flatMap
前两篇Android RxJava的使用(一)基本用法.Android RxJava的使用(二)Action介绍了RxJava的基本用法,对Rxjava还不了解的请先看以上两篇.这篇为大家讲解RxJa ...
- Java7与Java8中的HashMap和ConcurrentHashMap知识点总结
JAVA7 Java7的ConcurrentHashMap里有多把锁,每一把锁用于其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率呢.这 ...
随机推荐
- fcitx无法切换到中文(manjaro)
安装fcitx后不能切换到中文输入法,在.bashrc或者.profile中添加以下代码: #fcitx export GTK_IM_MODULE=fcitx export QT_IM_MODULE ...
- Unity3D中的SendMessage使用(消息传递的三种方法)
概述 Unity提供的消息推送机制可以非常方便我们的脚本开发,它实现的是一种伪监听者模式,利用的是反射机制. 常用函数 关于消息推送,常用的函数有三个:”SendMessage“.”SendMessa ...
- P2814 家谱
我真没什么创意了woc.. so,为什么一道水题是蓝色的???哦哦哦,水好像就是蓝色的,emmm那就不是恶意评分了嘤嘤嘤 ... 好吧实际上可能是非c党对于字符串的处理需要进行编号和结构体,会麻烦一点 ...
- Shell编程、part1
1.shell简介 2. shell分类 3. 查看shell 4. 第一个shell脚本 5. shell编程常用命令 5.1 grep 5.2 cut 5.3 sort 5.4 uniq 5.5 ...
- CVPR2019 论文解读| BASNet:关注边界的显著性目标检测
作者 | 文永亮 学校 | 哈尔滨工业大学(深圳) 研究方向 | 目标检测 概要 这是一篇发表于CVPR2019的关于显著性目标检测的paper,<BASNet:Boundary-Aware ...
- Metinfo3.0 /include/common.inc.php PHP代码注入
- lua基础学习(二)
一,Lua变量 1.lua变量的三种类型:全局变量,局部变量,表中的域 Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量. 局部变量的作用域为从声明位置 ...
- [ASP.NET] [JS] GridView点击高亮当前选择行,并在点击另一行时恢复上一选择行背景颜色
在ASP.NET中的gridview控件里面可以通过设定其OnRowDataBound事件来进行实现高亮当前行的操作 前端控件的设置: 只要设置好OnRowDataBound属性即可,会自动在.cs文 ...
- python 并发编程 基于gevent模块实现并发的套接字通信
之前线程池是通过操作系统切换线程,现在是程序自己控制,比操作系统切换效率要高 服务端 from gevent import monkey;monkey.patch_all() import geven ...
- [转帖]影驰首发PCIe 4.0 SSD:群联AMD合作主控飚出5GB/s
影驰首发PCIe 4.0 SSD:群联AMD合作主控飚出5GB/s https://www.cnbeta.com/articles/tech/851275.htm 硬件发展的真快.. AMD刚刚发布的 ...