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

新手上路,请多包涵
阅读 504
2 个回答

Both map and flatMap can be applied to a Stream<T> and they both return a Stream<R> .不同之处在于 map 操作为每个输入值生成一个输出值,而 flatMap 操作为每个输入值生成任意数字(零个或多个)值。

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

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

flatMap 操作接受一个函数,该函数在概念上想要消耗一个值并产生任意数量的值。然而,在 Java 中,方法返回任意数量的值是很麻烦的,因为方法只能返回零或一个值。可以想象一个 API,其中 flatMap 的映射器函数获取一个值并返回一个数组或 List 值,然后将其发送到输出。鉴于这是流库,表示任意数量的返回值的一种特别合适的方法是映射器函数本身返回一个流!映射器返回的流中的值从流中排出并传递到输出流。每次调用映射器函数返回的值“块”在输出流中根本没有区别,因此输出被称为“扁平化”。

典型用途是映射器函数 flatMap 返回 Stream.empty() 如果它想发送零值,或者类似 Stream.of(a, b, c) 想要 2da5fd1179c27b4 返回几个值。但是当然可以返回任何流。

原文由 Stuart Marks 发布,翻译遵循 CC BY-SA 3.0 许可协议

Stream.flatMap ,顾名思义,是 mapflat 操作的组合。这意味着您首先将一个函数应用于您的元素,然后将其展平。 Stream.map 仅将函数应用于流而不展平流。

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

原文由 Dici 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题