Fil*_*zak 1 java reactor reactive-programming
所以,我正在尝试使用 Webflux 并且我有一个场景“检查对象是否存在;如果存在,请执行操作,否则 - 指示错误”。
这可以在反应堆中写成:
public Mono<Void> handleObjectWithSomeId(Mono<IdType> id){
return id.
flatMap(repository::exists). //repository.exists returns Mono<Boolean>
flatMap(e -> e ? e : Mono.error(new DoesntExistException())).
then(
//can be replaced with just(someBusinessLogic())
Mono.fromCallable(this::someBusinessLogic)
);
}
Run Code Online (Sandbox Code Playgroud)
或作为:
public Mono<Void> handleObjectWithSomeId(Mono<IdType> id){
return id.
flatMap(repository::exists). //repository.exists returns Mono<Boolean>
flatMap(e -> e ? e : Mono.error(new DoesntExistException())).
map(e -> this.someBusinessLogic()));
}
Run Code Online (Sandbox Code Playgroud)
假设返回类型 ofsomeBusinessLogic不能改变并且它必须是 simple void,而不是Mono<Void>。
在这两种情况下,如果对象不存在,Mono.error(...)则会生成适当的对象。
虽然我理解这一点then并且flatMap有不同的语义,但实际上我得到了相同的结果。即使在第二种情况下我使用flatMap它的含义,我也可以跳过flatMap并fromCallable支持简单map的忽略参数(这似乎更具可读性)。我的观点是,在可读性和代码质量方面,这两种方法都有优点和缺点。
所以,这里有一个总结:
使用然后
使用 flatMap
这两种方法的其他优缺点是什么?选择运营商时应该考虑什么?
我发现这个反应堆问题表明速度没有真正的差异。
TL, DR:如果你关心前面计算的结果,你可以使用map(),flatMap()或其他map变体。否则,如果您只想完成上一个流,请使用then().
您可以通过.log()在两种方法中调用来查看自己的详细执行日志:
public Mono<Void> handleObjectWithSomeId(Mono<IdType> id) {
return id.log()
.flatMap(...)
...;
}
Run Code Online (Sandbox Code Playgroud)
与 Project Reactor 中的所有其他操作一样,已经定义了then() 和的语义flatMap()。上下文主要定义了这些运算符应该如何协同工作来解决您的问题。
让我们考虑您在问题中提供的上下文。什么flatMap()做的是,一旦进入一个事件,它异步执行的映射功能。
由于我们在问题Mono<>的最后一个之后有一个flatMap(),它会提供先前单次计算的结果,我们将其忽略。请注意,如果我们有一个Flux<>,则将对每个元素进行计算。
另一方面,then()不关心前面的事件序列。它只关心完成事件:
这就是为什么,在你的例子中,你使用哪一个并不重要。但是,在其他情况下,您可能会相应地选择。
您可能还会找到我需要哪个运算符?部分项目反应器参考很有帮助。
| 归档时间: |
|
| 查看次数: |
3497 次 |
| 最近记录: |