首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java8中,map()和flatMap()方法有什么不同?

在Java8中,map()和flatMap()方法有什么不同?
EN

Stack Overflow用户
提问于 2014-11-01 06:53:15
回答 9查看 493.9K关注 0票数 859

在Java8中,Stream.map()方法和Stream.flatMap()方法有什么不同?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-11-01 07:11:43

mapflatMap都可以应用于Stream<T>,并且它们都返回Stream<R>。不同之处在于,map操作为每个输入值生成一个输出值,而flatMap操作为每个输入值生成任意数量(零或更多)的值。

这反映在每个操作的参数中。

map操作接受一个Function,输入流中的每个值都会调用它并生成一个结果值,该值将被发送到输出流。

flatMap操作接受一个函数,该函数在概念上希望使用一个值并生成任意数量的值。然而,在Java中,方法返回任意数量的值是很麻烦的,因为方法只能返回0或1个值。可以想象这样一种应用编程接口,其中flatMap的映射器函数接受一个值,并返回一个数组或值的List,然后将这些值发送到输出。鉴于这是streams库,表示任意数量的返回值的一种特别合适的方法是让映射器函数本身返回一个流!映射器返回的流中的值将从流中排出,并传递给输出流。在输出流中,每次调用映射器函数所返回的值的“块”根本没有区别,因此输出被称为“扁平化”。

典型的用法是,如果flatMap的映射器函数希望发送零值,则返回Stream.empty();如果希望返回多个值,则返回类似Stream.of(a, b, c)的内容。当然,任何流都可以返回。

票数 975
EN

Stack Overflow用户

发布于 2014-11-01 06:58:57

传递给stream.map的函数必须返回一个对象。这意味着输入流中的每个对象在输出流中只产生一个对象。

传递给stream.flatMap的函数为每个对象返回一个流。这意味着该函数可以为每个输入对象返回任意数量的对象(包括无对象)。然后将得到的流连接到一个输出流。

票数 47
EN

Stack Overflow用户

发布于 2017-10-08 11:19:10

对于Map,我们有一个元素列表和a (function,action) f,因此:

代码语言:javascript
复制
[a,b,c] f(x) => [f(a),f(b),f(c)]

对于平面映射,我们有一个元素列表,我们有一个(function,action) f,我们希望结果被展平:

代码语言:javascript
复制
[[a,b],[c,d,e]] f(x) =>[f(a),f(b),f(c),f(d),f(e)]
票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26684562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档