在Java8中,Stream.map()
方法和Stream.flatMap()
方法有什么不同?
发布于 2014-11-01 07:11:43
map
和flatMap
都可以应用于Stream<T>
,并且它们都返回Stream<R>
。不同之处在于,map
操作为每个输入值生成一个输出值,而flatMap
操作为每个输入值生成任意数量(零或更多)的值。
这反映在每个操作的参数中。
map
操作接受一个Function
,输入流中的每个值都会调用它并生成一个结果值,该值将被发送到输出流。
flatMap
操作接受一个函数,该函数在概念上希望使用一个值并生成任意数量的值。然而,在Java中,方法返回任意数量的值是很麻烦的,因为方法只能返回0或1个值。可以想象这样一种应用编程接口,其中flatMap
的映射器函数接受一个值,并返回一个数组或值的List
,然后将这些值发送到输出。鉴于这是streams库,表示任意数量的返回值的一种特别合适的方法是让映射器函数本身返回一个流!映射器返回的流中的值将从流中排出,并传递给输出流。在输出流中,每次调用映射器函数所返回的值的“块”根本没有区别,因此输出被称为“扁平化”。
典型的用法是,如果flatMap
的映射器函数希望发送零值,则返回Stream.empty()
;如果希望返回多个值,则返回类似Stream.of(a, b, c)
的内容。当然,任何流都可以返回。
发布于 2014-11-01 06:58:57
传递给stream.map
的函数必须返回一个对象。这意味着输入流中的每个对象在输出流中只产生一个对象。
传递给stream.flatMap
的函数为每个对象返回一个流。这意味着该函数可以为每个输入对象返回任意数量的对象(包括无对象)。然后将得到的流连接到一个输出流。
发布于 2017-10-08 11:19:10
对于Map,我们有一个元素列表和a (function,action) f,因此:
[a,b,c] f(x) => [f(a),f(b),f(c)]
对于平面映射,我们有一个元素列表,我们有一个(function,action) f,我们希望结果被展平:
[[a,b],[c,d,e]] f(x) =>[f(a),f(b),f(c),f(d),f(e)]
https://stackoverflow.com/questions/26684562
复制相似问题