【发布时间】:2018-09-17 12:33:31
【问题描述】:
所以,我正在尝试使用 Webflux,并且我有一个场景“检查对象是否存在;如果存在,则执行操作,否则 - 指示错误”。
在reactor中可以写成:
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)
);
}
或作为:
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()));
}
假设someBusinessLogic的返回类型不能改变,它必须是简单的void,而不是Mono<Void>。
在这两种情况下,如果对象不存在,则会生成适当的Mono.error(...)。
虽然我知道then 和flatMap 具有不同的语义,但实际上我得到了相同的结果。即使在第二种情况下,我使用 flatMap 与它的含义相反,我也可以跳过 flatMap 和 fromCallable 以支持简单的 map 并忽略参数(这似乎更具可读性)。我的观点是,在可读性和代码质量方面,这两种方法各有利弊。
所以,总结一下:
然后使用
- 优点
- 语义正确
- 缺点
- 在许多情况下(如上)需要包装在 ad-hoc Mono/Flux 中
使用平面地图
- 优点
- 简化了持续的“快乐场景”代码
- 缺点
- 语义不正确
这两种方法的其他优点/缺点是什么?选择运营商需要注意什么?
我发现this reactor issue 表明速度没有真正的差异。
【问题讨论】:
标签: java reactive-programming reactor