我应该使用同步 Mono::map 还是异步 Mono::flatMap?

Should I use synchronous Mono::map or asycnhronous Mono::flatMap?

projectReactor 文档说 Mono::flatMap 异步的 ,如下所示。

所以,我可以像这样将我所有的方法写给 return Mono 发布者。

public Mono<String> myMethod(String name) {
    return Mono.just("hello " + name);
}

并像这样与 Mono::flatMap 一起使用:

Mono.just("name").flatMap(this::myMethod);

这会使我的方法异步执行吗?这是否使我的代码 更具反应性 ,比仅使用 Mono::map 更好更快?对我的所有方法执行此操作的开销是否过高?

public final Mono flatMap(Function<? super T,? extends Mono<? extends R>> transformer)

异步转换此 Mono 发出的项目,returning 另一个 Mono 发出的值(可能更改值类型)。

Does this make the execution of my method asynchronous?

让我们为此去Asynchronous的定义:

异步编程是并行编程的一种方式,其中工作单元独立于主应用程序线程运行,并通知调用线程其完成、失败或进度。

此处您的工作单元发生在同一个线程中,除非您使用 subscribeOnScheduler。所以这不是异步的。

Does this make my code more reactive, better and faster than just using Mono::map?

没办法。由于在这种情况下,发布者 Mono.just("hello " + name) 会立即通知订阅者我已完成处理,因此正在进行处理的线程会立即从事件循环中获取该事件并开始处理响应。

相反,与 map 简单地转换元素相比,这可能会导致更多的内部操作。

因此,理想情况下,当您有 I/O 操作(如数据库调用)或网络调用 时,您应该使用 flatMap,这可能需要一些时间,如果所有线程都忙,您可以利用它来完成其他任务。