Java 8中的map()和flatMap()方法有什么区别?

967

72
类型签名已经说明了一切。map :: Stream T -> (T -> R) -> Stream RflatMap :: Stream T -> (T -> Stream R) -> Stream R - Chris Martin
158
就我所知,那些类型签名甚至看起来都不像Java。(我知道我知道,但说这话会假定许多关于新的改进版“Java++”的知识,因此不能用它来说明map/flatMap的全部情况。) - michael
19
@michael 那个类型签名看起来像是 Haskell,而不是 Java。但实际的 Java 签名是否更易读并不清楚:<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper) - Stuart Marks
17
是的,我所说的“实际Java”是指现代Java。 类似于C ++,现代Java与在90年代开始使用它的人(像我一样,两种语言都用过)几乎是不可识别的。 我只是回复评论,方法签名很难讲述“整个故事”,至少现在是这样,除非有额外的解释(或者对于那位评论者来说,翻译)。 - michael
5
换句话说,map方法的映射函数返回类型为R,而flatMap方法的映射函数返回类型为Stream<R>flatMap方法返回的流是将所有映射后的Stream<R>连接起来的结果。两种方法都返回类型为Stream<R>的流,区别在于映射函数的返回值类型,一个是R,一个是Stream<R> - derekm
2
如果每个元素被转换为单个值,则使用 map。如果每个元素将被转换为多个值,并且需要展平结果流,则使用 flatMap - DimaSan
22个回答

0

如果你熟悉的话,还可以用C#做个类似的比喻。基本上,C#的Select类似于Java的map,而C#的SelectMany则类似于Java的flatMap。对于Kotlin的集合也是一样的。


0

map() 方法接收一个 Stream 并将其转换为另一个 Stream。它对 Stream 的每个元素应用一个函数,并将返回值存储到新的 Stream 中。它不会扁平化流。但是 flatMap() 是 map 和 flat 操作的组合,即它既对元素应用函数,又将它们扁平化。 2) map() 仅用于转换,而 flatMap() 用于转换和扁平化。 请在此处阅读更多信息。 https://javaint4bytes.blogspot.com/2022/11/stream-flatmap-in-java-with-examples.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接