在 Java 8 中, Stream.map()
和 Stream.flatMap()
方法有什么区别?
原文由 cassiomolin 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Java 8 中, Stream.map()
和 Stream.flatMap()
方法有什么区别?
原文由 cassiomolin 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
Both
map
andflatMap
can be applied to aStream<T>
and they both return aStream<R>
.不同之处在于map
操作为每个输入值生成一个输出值,而flatMap
操作为每个输入值生成任意数字(零个或多个)值。这反映在每个操作的参数中。
map
操作采用Function
,为输入流中的每个值调用它并产生一个结果值,该结果值被发送到输出流。flatMap
操作接受一个函数,该函数在概念上想要消耗一个值并产生任意数量的值。然而,在 Java 中,方法返回任意数量的值是很麻烦的,因为方法只能返回零或一个值。可以想象一个 API,其中flatMap
的映射器函数获取一个值并返回一个数组或List
值,然后将其发送到输出。鉴于这是流库,表示任意数量的返回值的一种特别合适的方法是映射器函数本身返回一个流!映射器返回的流中的值从流中排出并传递到输出流。每次调用映射器函数返回的值“块”在输出流中根本没有区别,因此输出被称为“扁平化”。典型用途是映射器函数
flatMap
返回Stream.empty()
如果它想发送零值,或者类似Stream.of(a, b, c)
想要 2da5fd1179c27b4 返回几个值。但是当然可以返回任何流。