map
和flatMap
都可以应用于Stream<T>
,它们都返回Stream<R>
.不同之处在于,map
操作 for each 输入值生成一个输出值,而flatMap
操作 for each 输入值生成任意数(零或更多)的值.
这反映在每个操作的参数中.
map
操作采用Function
,输入流中的每个值调用Function
,并生成一个结果值,该结果值被发送到输出流.
flatMap
操作采用的函数在概念上希望使用一个值并生成任意数量的值.然而,在Java中,方法返回任意数量的值是很麻烦的,因为方法只能返回零或一个值.可以想象一个API,其中flatMap
的mapper函数获取一个值并返回一个数组或List
个值,然后将其发送到输出.鉴于这是streams库,表示任意数量的返回值的一种特别合适的方法是让mapper函数本身返回一个流!映射器返回的流中的值将从流中排出,并传递到输出流.每次调用mapper函数返回的值的"束"在输出流中根本没有区别,因此输出被称为"平坦"
典型的用法是,如果mapper函数flatMap
想要发送零值,则返回Stream.empty()
,如果想要返回多个值,则返回Stream.of(a, b, c)
之类的值.但当然,任何流都可以返回.