给定单词列表[“Hello”,“World”],你想要返回列表[“H”,“e”,“l”, “o”,“W”,“r”,“d”]

你可能首先想到的是:可以把每个单词映射成一张字符表,然后调用distinct来过滤重复的字符。

即:

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

这个方法的问题在于,传递给map方法的Lambda为每个单词返回了一个String[](String 列表)。因此,map返回的流实际上是Stream<String[]>类型的。你真正想要的是用 Stream 来表示一个字符流,如图:

  1. 尝试使用mapArrays.stream()

首先,你需要一个字符流,而不是数组流。有一个叫作Arrays.stream()的方法可以接受

一个数组并产生一个流,例如:

String[] arrayOfWords = {"Goodbye", "World"}; Stream<String> streamOfwords = Arrays.stream(arrayOfWords);

把它用在前面的那个流水线里,看看会发生什么:

words.stream() .map(word -> word.split("")) //将每个单词转换为由其字母构成的数组.map(Arrays::stream)//让每个数组变成一个单独的流.distinct() .collect(toList());

当前的解决方案仍然搞不定!这是因为,你现在得到的是一个流的列表(更准确地说是Stream)。的确,你先是把每个单词转换成一个字母数组,然后把每个数组变成了一

个独立的流。

  1. 使用flatMap

你可以像下面这样使用flatMap来解决这个问题:

List<String> uniqueCharacters = words.stream() .map(w -> w.split("")) //将每个单词转换为由其字母构成的数组.flatMap(Arrays::stream) //将各个生成流扁平化为单个流.distinct() .collect(Collectors.toList());

使用flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。所

有使用map(Arrays::stream)时生成的单个流都被合并起来,即扁平化为一个流。下图说明了

使用flatMap方法的效果。

总而言之,flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。

举一反三

给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见,你可以用有两个元素的数组来代表数对。

解答:
你可以使用两个map来迭代这两个列表,并生成数对。但这样会返回一个Stream-<Stream<Integer[]>>。你需要让生成的流扁平化,以得到一个Stream<Integer[]>。这
正是flatMap所做的:

List<Integer> numbers1 = Arrays.asList(1, 2, 3);
List<Integer> numbers2 = Arrays.asList(3, 4);
List<int[]> pairs = numbers1.stream() .flatMap(i -> numbers2.stream() .map(j -> new int[]{i, j}) ) .collect(toList());

Java8 FlatMap的使用相关推荐

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

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

  2. 【Java 8 新特性】Java 8 flatMap 使用示例

    文章目录 1.在List中使用`Stream.flatMap`方法 2.在List列表中使用`Stream.flatMap`方法 3.在Array中使用`Stream.flatMap`方法 4.在对象 ...

  3. java双层list扁平化,浅谈java8 stream flatMap流的扁平化操作

    概念: Steam 是Java8 提出的一个新概念,不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具.简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以 ...

  4. Java8 - Streams flatMap()

    文章目录 官方文档 What is flatMap()? Why flat a Stream? Demo 需求1:Find all books 需求2:Order and LineItems 需求3: ...

  5. Java8 Steam API中groupingBy和flatMap方法的使用

    1. groupingBy分组器 /*** 使用java8 stream groupingBy操作,按城市分组list*/ @Test public void groupingByTest() {Ma ...

  6. Java8 Stream flatMap使用

    一句话总结,类似于ES6中的多维数组展平 ⏹1. flatMap实践 实体类 class User {Integer id;String name;List<String> hobby;/ ...

  7. Java8中map与flatMap用法

    目录 1 概述 2 map与flatMap 3 常用写法 1 概述 Java8中一些新特性在平时工作中经常会用到,但有时候总感觉不是很熟练,今天特意将这个Java8中的映射记录一下. 2 map与fl ...

  8. Java基础之Java8中map和flatMap的使用

    Java基础之Java8中map和flatMap的使用 一.介绍 首先,看下map和flatMap的官方文档说明 map flatMap 其实单纯的看api说明还是比较抽象,下面我将以几个实战例子来帮 ...

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

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

最新文章

  1. Android上成功实现了蓝牙的一些Profile
  2. No valid host was found. There are not enough hosts available
  3. Vivado使用误区与进阶——XDC约束技巧之I/O篇 (下)
  4. python读excel字体颜色_无法使用python xlsxwri更改excel中的字体颜色
  5. 作为一个新人,如何学习嵌入式Linux?
  6. ContextLoaderListener作用详解
  7. 魔兽世界 服务器维护,魔兽世界8.0:服务器崩溃紧急维护三小时 网易这次得背大锅!...
  8. x10i升级android4.0,升级Android 2.1改变归纳_索尼爱立信 X10i_手机Android频道-中关村在线...
  9. 推荐学习网页标准的20个好去处
  10. SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化
  11. Linux configure 参数解释
  12. 2011-6-22精品软件【清风网络整理】
  13. mysql关联力控_力控软件和三菱PLC的通讯模块通讯设定
  14. 关于Unity 接入VR镜头的设置
  15. 鞠今日截语2014.05.11火星合月
  16. 计算机硬盘图标不见了,移动硬盘不显示图标怎么办 移动硬盘不显示图标解决办法【图文】...
  17. 计算机爱情诗,优美诗句大全
  18. 分享:一套开源的办公套件,适用于企业、团队的协同办公平台DzzOffice
  19. Linux常见错误 “cp: omitting directory/ cp: :Permission denied”解决办法
  20. 09-slash_backslash

热门文章

  1. php 抽象类和接口的区别
  2. 融云开发案例核心代码分享
  3. Window.ActiveXObject的用法 以及如何判断浏览器的类型
  4. linux系统下tar打包压缩命令的使用总结
  5. 设计模式07_建造者
  6. 个人量化策略整理_较好
  7. 兰州大学c语言课程作业答案,2016兰州大学C语言程序设计课程作业1附答案.doc
  8. jq多选按钮值_关于jquery的多选框获取值和状态回显
  9. 【必备干货】1000字讲清3大财务数据表
  10. 学习精华——成长篇(三)