【问题标题】:Project Reactor. Mono.map() vs Mono.flatMap()项目反应堆。 Mono.map() 与 Mono.flatMap()
【发布时间】:2019-10-23 02:03:00
【问题描述】:

Mono 而言,它们之间的主要区别是什么? 从文档中,我读到flatMap 是异步的,map 是同步的。但这对我来说真的没有意义 b/c Mono 都是关于并行性的,这一点是无法理解的。有人可以用更容易理解的方式改写它吗?

然后在flatMap 的文档中声明(https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#flatMap-java.util.function.Function-):

Transform the item emitted by this Mono asynchronously, returning the 
value emitted by another Mono (possibly changing the value type).

那里的另一个 Mono 是什么意思?

【问题讨论】:

    标签: spring-webflux project-reactor


    【解决方案1】:

    Mono#flatMap 采用 Function 将一个值转换为另一个 Mono。 Mono 可以代表一些异步处理,例如 HTTP 请求。

    另一方面,Mono#map 采用FunctionT 类型的值转换为另一个R 类型的值。因此,这种转换是命令式和同步完成的(例如,将 String 转换为 URL 实例)。

    flatMap 的另一个微妙之处在于,运算符订阅了生成的 Mono,这与将相同的 Function 传递给 map 会发生的情况不同。

    【讨论】:

    • 是否意味着如果我使用Mono#map,转换将立即应用而无需等待订阅?使用Mono#flatMap,它会在订阅者出现后首先执行?我真的不明白为什么我需要用 flatMap 创建一个新的Mono
    • 另一个问题,我说得对吗,Mono#map, #flatMapjava.util.stream.Stream#map#flatMap 没有直接关系?
    • 它们确实与Stream 方法有关! Stream#flatMap 从内部流中收集值并将它们展平在结果 Stream 中。在反应类型中,“收集”部分意味着订阅。唯一的区别是在Mono#flatMap 中最多只有一个值可以展平,因此更接近的方法是Mono#flatMapMany(导致Flux
    • 最重要的是,您在 Mono#flatmap 中的转换函数应该返回一个发布者(Mono)供 flatMap 操作员订阅。这就是语法上的区别。另一个主要(更重要的)差异是,如果您的转换函数涉及阻塞调用,则最好使用 flatMap 以便它返回的 Publisher 可以在后台继续异步处理,从而使您的管道端到端异步。另一方面,map 只会阻塞线程,从而影响管道的异步行为。
    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 2021-06-27
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多