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 的元素并希望流被完成时应该使用
假设我想调用一个 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 的元素并希望流被完成时应该使用