flatMap

Posted 叶沐雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flatMap相关的知识,希望对你有一定的参考价值。

概述

flatMap() 是Stream类中的方法,用于在Java中扁平化流。

Stream

流能够保存不同类型的数据。

  1. Stream<T> – 每个元素都是一个对象的流。
  2. IntStreamDoubleStream, 或者 LongStream – 每个元素都是原始数据类型的流。
  3. Stream<int[]> – 每个元素都是原始数组的流。
  4. Stream<T[]> – 每个元素都是一个对象数组的流。
  5. Stream<List<T>> – 每个元素都是一个列表的流。
  6. Stream<Collection<T>> – 每个元素都是一个集合的流。

flatMap用法

flatMap() 方法可用于在 Java 中扁平化流,如下所示:
Stream<T[]> --> Stream<T>
Stream<List<T>> --> Stream<T>
 flatMap() 可以转换流  "A", "B", "C", "D", "E", "F"  至
"A", "B", "C", "D", "E", "F"
flatMap() 采用映射方法,该方法将应用于流的每个元素,以促进流的扁平化。

例子

多个List或两层List的扁平化

public static void main(String[] args)   
	m1();  
	m2();  
  
  
/**  
* 多个list合并为一个list  
* 1. Stream.of(l1, l2),产生的是Stream<List<String>>  
* 2. flatmap,扁平化为一个流,Stream<String>  
*/  
public static void m1()   
	List<String> l1 = Arrays.asList("A", "B");  
	List<String> l2 = Arrays.asList("C", "D");  
	List<String> list = Stream.of(l1, l2).flatMap(List::stream)
	.collect(Collectors.toList());  
	log.info("list:", list);  
  
  
/**  
* 两层List的扁平为一层List  
*/  
public static void m2()   
	List<List<String>> list = new ArrayList<>();  
	List<String> l1 = Arrays.asList("A", "B");  
	List<String> l2 = Arrays.asList("C", "D");  
	list.add(l1);  
	list.add(l2);  
	List<String> fList = list.stream()
	.flatMap(List::stream).collect(Collectors.toList());  
	log.info("fList:", fList);  

结果

19:27:12.728 [main] INFO com.xy.base.stream.FlatMapTest - list:[A, B, C, D]
19:27:12.744 [main] INFO com.xy.base.stream.FlatMapTest - fList:[A, B, C, D]

flatMapToInt

Stream.of() 原始整数数组上的方法返回 Stream<int[]>.我们可以用 flatMapToInt() 转换原始数组流的方法 Stream<int[]> 至 IntStream,然后转换为List<Integer>

public static void m3()   
	int[] array1 = new int[]1, 2;  
	int[] array2 = new int[]3, 4;  
	List<Integer> list = Stream.of(array1, array2).flatMapToInt(Arrays::stream)  
		.boxed()  
		.collect(Collectors.toList());  
		log.info("list:", list);  

结果

20:36:57.229 [main] INFO com.xy.base.stream.FlatMapTest - list:[1, 2, 3, 4]

类似的还有flatMapToDouble,flatMapToLong

参考资料

https://www.techiedelight.com/zh/flatten-streams-flatmap-method-java8/

Javascript - 数组上的 flatMap 方法 - (flatMap 不是函数)

【中文标题】Javascript - 数组上的 flatMap 方法 - (flatMap 不是函数)【英文标题】:Javascript - flatMap method over array - (flatMap is not a function) 【发布时间】:2019-08-27 01:55:27 【问题描述】:

根据 Mozilla 开发者网站:

The flatMap() method first maps each element using a mapping function, then flattens the result into a new array. It is identical to a map followed by a flat of depth 1, but flatMap is often quite useful, as merging both into one method is slightly more efficient.

例子:

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

const flatMap = arr.flatMap(x => x);
console.log(flatMap);

TypeError: arr.flatMap() is not a function

为什么会返回这个错误?

编辑

我正在通过 Atom 文本编辑器运行它,并使用 HomeBrew 使用 brew upgrade node 将其更新到最新版本,但它仍然给我同样的错误。

我也试过npm install n -g

【问题讨论】:

您的浏览器可能还不支持它。但是,在该数组上使用 flatMap 有什么意义? 我只是想看看它是否有效,然后也测试其他值。 The documentation 有很多例子,如果你的浏览器不支持alternatives developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 这只是browser compatibility的问题,因为它只支持新的浏览器。 【参考方案1】:

我在用 jest 测试时得到了这个,这是因为 flatmap 只是 part of node 11 而我使用的是节点 10。

作为一种解决方法,我在setupTests.ts 中添加了require('core-js/stable');

我想也有一些浏览器不会有这个。因此,我还将在我的应用程序导入中的某处放置该 require 行。

【讨论】:

【参考方案2】:

表示你使用的浏览器或其他开发环境不支持Array.prototype.flatMap(目前Edge和IE都不支持)。可以使用表here。

另请注意,它主要用于多维数组(避免链接mapflat,因此flatMap)。

【讨论】:

在我的情况下,我只会使用自制软件进行升级,对吗? brew upgrade node 对吗? 更简单(不需要 Homebrew)-npm install n -g(参见this answer)。 只需卸载 node 并使用 nvm 重新安装它:github.com/creationix/nvm【参考方案3】:

您的浏览器似乎不支持flatMap。 以下是支持的浏览器的完整列表:https://caniuse.com/#search=flatMap

如果你真的想使用它,这里是一个 polyfill,它将支持 ES3:https://www.npmjs.com/package/array.prototype.flatmap

顺便说一句,它在应用于多维数组时很有用!

【讨论】:

欣赏它,我在 atom 上运行它并相信我将它更新为最新版本的节点,但仍然无法正常工作。 我建议在节点上开发时使用:github.com/creationix/nvm :)

以上是关于flatMap的主要内容,如果未能解决你的问题,请参考以下文章

Angular RxJS flatMap这个_this

为啥我们需要使用 flatMap?

flatMap

flatMap 重用响应式调用的响应

在 Scala Akka 期货中,map 和 flatMap 有啥区别?

FlatMap vs Filter,Map Java [重复]