项目反应堆。Mono.map() 与 Mono.flatMap()

Rom*_*n T 7 project-reactor spring-webflux

这些之间的主要区别是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).
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*slé 15

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

在另一方面,Mono#map需要Function该变换类型的值T另一值,类型的R。因此,该转换是命令式和同步完成的(例如,将 aString转换为URL实例)。

另一个微妙之处flatMap是操作符订阅了生成的Mono,这与将相同的传递Functionmap.

  • 这是否意味着如果我使用“Mono#map”,转换将立即应用,而无需等待订阅?对于“Mono#flatMap”,它会在订阅者存在后首先执行吗?我真的不明白为什么我需要用 flatMap 创建一个新的“Mono”。 (3认同)
  • 另一个问题,我说得对吗,“Mono#map, #flatMap”与“java.util.stream.Stream”的“#map”和“#flatMap”没有直接关系吗? (3认同)
  • 它们确实与“Stream”方法相关!`Stream#flatMap` 从内部流收集值并将它们展平到结果 `Stream` 中。在响应式类型中,“收集”部分意味着订阅。唯一的区别是,在 `Mono#flatMap` 中最多只有一个值要展平,因此更接近的方法是 `Mono#flatMapMany` (这会产生一个 `Flux`) (3认同)
  • 最重要的是,Mono#flatmap 中的转换函数应该返回一个 Publisher (Mono),供 flatMap 运算符订阅。这就是语法上的区别。另一个主要(更重要)的差异是,如果您的转换函数涉及阻塞调用,那么您最好使用 flatMap,以便它返回的 Publisher 可以在后台继续异步处理,从而使您的管道端到端异步。另一方面,映射只会阻塞线程,从而影响管道的异步行为。 (3认同)