Java 8 中的 map() 和 flatMap() 方法有什么区别?
Stream.map()
在 Java 8
中,和方法有什么区别Stream.flatMap()
?
-
两者
map
和flatMap
都可以应用于 aStream<T>
并且它们都返回 a
Stream<R>
。不同之处在于该map
操作为每个输入值生成一个输出值,而该flatMap
操作为每个输入值生成任意数量(零个或多个)值。这反映在每个操作的参数中。
该
map
操作采用 aFunction
,为输入流中的每个值调用它并生成一个结果值,该结果值被发送到输出流。该
flatMap
操作采用概念上想要消耗一个值并产生任意数量的值的函数。但是,在 Java
中,方法返回任意数量的值是很麻烦的,因为方法只能返回零或一个值。可以想象一种 API,其中 mapper
函数flatMap
获取一个值并返回一个数组或List
的值,然后将其发送到输出。鉴于这是流库,表示任意数量的返回值的一种特别恰当的方法是映射器函数本身返回一个流!映射器返回的流中的值从流中排出并传递给输出流。每次调用映射器函数返回的值的“团块”在输出流中根本没有区别,因此输出被称为“扁平化”。典型的用途是如果它想要发送零值,或者如果它想要返回多个值,则
flatMap
返回的映射器函数。但是当然可以返回任何流。Stream.empty()``Stream.of(a, b, c)