java中map是把集合每个元素重新映射,元素个数不变,但是元素值发生了变化。而flatMap从字面上来说是压平这个映射,实际作用就是将每个元素进行一个一对多的拆分,细分成更小的单元,返回一个新的Stream流,新的流元素个数增加。

java官方给出的示例如下:

# 按行读取文件内容
Stream<String> lines = Files.lines(path);
# 将每一行文字按照空格拆分为单词
Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));

如下所示的文本:

hello world
this is a test txt
done

经过这个转换,得到的结果如下:

[hello, world, this, is, a, test, txt, done]

我们大概知道,flatMap压平的作用,就是把原来的三行字符串文字变为了一个流,流数组中每个元素是单词。

============

我们假设有这样的需求,有一个[[1,3],[2,4]]的二维数组,我们要得到一个一维数组[1,3,2,4]。那么这里的flatMap就正好排上用场,原来是二维的,现在压平为一维,正好分解了。

List<Integer> lista = new ArrayList<>();
lista.add(1);
lista.add(3);List<Integer> listb = new ArrayList<>();
listb.add(2);
listb.add(4);
List<List<Integer>> listc = new ArrayList<>();
listc.add(lista);
listc.add(listb);
System.out.println(listc);
List<Integer> listd = listc.stream().flatMap(ele -> ele.stream()).collect(Collectors.toList());
System.out.println(listd);

运行程序打印信息如下:

[[1, 3], [2, 4]]
[1, 3, 2, 4]

flatMap里面需要传入一个Function参数,这里根据需要将数组转为stream。其实可以直接传入一个函数名:Collection::stream,效果是一样的。

完整代码如下:

package org.example;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class FlatMapExample {public static void main(String[] args) {List<Integer> lista = new ArrayList<>();lista.add(1);lista.add(3);List<Integer> listb = new ArrayList<>();listb.add(2);listb.add(4);List<List<Integer>> listc = new ArrayList<>();listc.add(lista);listc.add(listb);System.out.println(listc);List<Integer> listd = listc.stream().flatMap(Collection::stream).collect(Collectors.toList());System.out.println(listd);try {Stream<String> stream = Files.lines(Paths.get("test.txt"));// stream.forEach(System.out::println);List<String> words = stream.flatMap(line -> Stream.of(line.split(" +"))).collect(Collectors.toList());System.out.println(words);} catch (IOException e) {throw new RuntimeException(e);}}
}

运行截图:

Stream对象经过一次操作之后,内容就会被清除,同时流也被关闭。如果还进行第二次其他操作,那么就会报错:

stream has already been operated upon or closed

所以进行流操作,一般都是把所有的流程都以链式写法写在一起,最后得到结果。

java中flatMap用法相关推荐

  1. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  2. java中extends用法_JAVA的extends用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  3. java中continue用法

    java中continue用法 有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 java提供了 continue 语句.continue ...

  4. java中switch用法举例范围_Java中Switch用法代码示例

    一.java当中的switch与C#相比有以下区别 注:在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样), 在java1.7后 ...

  5. java中Iterator用法总结

    Java中Iterator用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级& ...

  6. java中nextInt()用法

    java中nextInt用法 功能 函数实现 三级目录 功能 给定一个参数n,nextInt(n)将返回一个大于等于0小于n的随机数,即:0 <= nextInt(n) < n. 函数实现 ...

  7. cal java中的用法_Java中static用法

    Java中static用法 转自 http://blog.pfan.cn/sword2008/13772.html 一.static 请先看下面这段程序: public class Hello{ pu ...

  8. JAVA中throw用法例子,Java Optional orElseThrow()用法及代码示例

    Java中的java.util.Optional类的orElseThrow()方法用于获取此Optional实例(如果存在)的值.如果此Optional实例中不存在任何值,则此方法将引发从指定供应商生 ...

  9. JAVA中this用法小结

    我知道很多朋友都和我一样:在JAVA程序中似乎经常见到"this",自己也偶尔用到它,但是到底"this"该怎么用,却心中无数!很多人一提起它,就说" ...

最新文章

  1. 百家争鸣|国内外NLP领域学术界和工业界的牛人和团队
  2. 如何使用Twitter Bootstrap获得中心内容?
  3. SQL必知必会——插入数据(十五)
  4. Qt多线程示例--并发数据处理
  5. couchdb java 连接_CouchDB客户端连接的说明---Java版
  6. 后台接收数组_微信小程序如何与后台api接口进行数据交互(微信报修小程序源码讲解七)...
  7. 禁用内置键盘_如何禁用Windows 10的所有内置广告
  8. Ubuntu扩展触摸屏触控错位修复
  9. 加密芯片算法移植方案的优点
  10. 一位寒门博士的致谢,女友回复...
  11. 怎样将short[]数组转换成byte[]数组
  12. MaxToMaya(3DMax场景转换插件)v1.4版
  13. 最近刚开始学编程,记录一下学习感受
  14. Python-打印指定范围内的全部回文素数(高教社,《Python编程基础及应用》习题8-7) (10分) 回文素数是指一个数既是素数又是回文数,例如131既是素数又是回文数。
  15. 维乐美学系列:美丽背后的匠心打造
  16. 网易考拉海购:电商高并发架构设计的铁律
  17. 董孝魁:通证经济重塑企业价值,区块链应赋能服务实体
  18. 开关调色新世界BP2888电源解决方案
  19. 【资源】OpenCV3编程入门_毛星云
  20. NORDIC Thing:52 Android App 学习之二:手机 App 蓝牙服务发现及数据读取

热门文章

  1. 基于python快速简便地实时计算金融技术指标
  2. 使用IIS运行JSP
  3. cdr 表格自动填充文字_WPS技巧 | 10 个无法拒绝的表格神操作,简单却实用到爆...
  4. notepad++安装记录
  5. 2018/10/02
  6. 发现星期六日的电视比较好看
  7. Photoshop脚本:调整图层的顺序
  8. GitHub贡献全球第5,超15,000名软件工程师,后深度学习时代英特尔如何「软硬兼施」
  9. 为什么sparksession.sql(“set hive.support.quoted.identifiers=none”)不起作用?
  10. python绘制四叶花瓣_python第四次实验(课后)