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

2022-08-31 04:01:07

在Java 8中,Stream.map()Stream.flatMap()方法之间有什么区别?


答案 1

两者都可以应用于 a,并且它们都返回 .不同之处在于,该操作为每个输入值生成一个输出值,而该操作为每个输入值生成任意数字(零个或多个)值。mapflatMapStream<T>Stream<R>mapflatMap

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

该操作采用 一个 ,该值为输入流中的每个值调用,并生成一个结果值,该结果值被发送到输出流。mapFunction

该操作采用一个函数,该函数在概念上希望使用一个值并生成任意数量的值。但是,在 Java 中,方法返回任意数量的值很麻烦,因为方法只能返回零个或一个值。可以想象一个API,其中的映射器函数获取一个值并返回一个数组或一个值,然后将其发送到输出。假设这是流库,表示任意数量的返回值的一种特别合适的方法是映射器函数本身返回流!映射器返回的流中的值将从流中排出并传递到输出流。每次调用映射器函数返回的值的“clumps”在输出流中根本没有区别,因此输出被称为“平展”。flatMapflatMapList

典型用法是映射器函数在想要发送零值时返回,或者如果它想要返回多个值,则返回映射器函数。但是,当然可以返回任何流。flatMapStream.empty()Stream.of(a, b, c)


答案 2

Stream.flatMap,正如其名称所猜测的那样,它是 a 和 a 操作的组合。这意味着您首先将函数应用于元素,然后将其展平。 仅将函数应用于流而不展平流。mapflatStream.map

要了解流平整的组成,请考虑具有“两个级别”的结构。扁平化这意味着将其转换为“一级”结构: 。[ [1,2,3],[4,5,6],[7,8,9] ][ 1,2,3,4,5,6,7,8,9 ]


推荐