Mono.then 和 Mono.flatMap/map 的区别

Difference between Mono.then and Mono.flatMap/map

假设我想调用一个 webservice1,如果第一个成功则调用 webservice2。

我可以执行以下操作(只是指示性伪代码):-

Mono.just(reqObj)
.flatMap(r -> callServiceA())
.then(() -> callServiceB())

Mono.just(reqObj)
.flatMap(r -> callServiceA())
.flatMap(f -> callServiceB())

当对单个元素使用 mono.just() 时,两者有什么区别?

Here's a detailed explanation from @MuratOzkan

复制粘贴 TL DR 答案:

If you care about the result of the previous computation, you can use map(), flatMap() or other map variant. Otherwise, if you just want the previous stream finished, use then().

在你的例子中,看起来你的服务调用不需要上游的输入,那么你可以用这个代替:

Mono.just(reqObj)
.then(() -> callServiceA())
.then(() -> callServiceB())

flatMap 应该用于非阻塞操作,或者简而言之任何 returns 支持 Mono、Flux 的操作。

map当你想对一个对象/数据进行固定时间的转换时应该使用。同步完成的操作。

例如:

return Mono.just(Person("name", "age:12"))
    .map { person ->
        EnhancedPerson(person, "id-set", "savedInDb")
    }.flatMap { person ->
        reactiveMongoDb.save(person)
    }

then 当你想忽略来自先前 Mono 的元素并希望流被完成时应该使用