这是样板代码:我想做这样的事情 -
public Flux<Object2> getSomething(String email) {
method1(email).map(result -> { //method1 returns Mono<Object1>
if(result.id().isEmpty()) {
return method2(email); //method2 returns Flux<Object2>
} else {
return Flux.empty();
}
};
});
因此,当method1返回一个空的Object1.id()时,则只调用method2。否则返回空的Flux。
需要注意的指针是 -
if(Object1.id().isEmpty()){
throw new IllegalArgumentException;
}
并在上面的代码片段中:
try {
method1(email);
} catch(IllegalArgumentException e) {
return method2(email);
}
永远不会在这里遇到异常。
你的第一个代码片段不应该编译,因为方法实现没有返回任何东西,所以我会试着猜测发生了什么。
此处没有任何操作,因为该方法不会返回您正在创建的Publisher。 If nothing subscribes to that Flux/Mono, nothing happens。
public Flux<Object2> getSomething(String email) {
return method1(email)
.filter(result -> result.id().isEmpty())
.flatMapMany(result -> method2(email));
}
然后你可以使用filter
来过滤掉结果,如果不符合谓词,就不会从那个Mono
发出任何东西。此外,flatMapMany
将帮助您在此处将结果转换为预期的返回类型。
您应该使用switchIfEmpty()运算符。
此外,如果要从方法返回两种类型(Mono和Flux),则将返回类型更改为org.reactiveStreams.Publisher。我不会推荐这个。
而是返回一个Flux。即使只返回1个数据,也可以作为Flux返回。将Mono转换为Flux,如果它将用户switchIfEmpty运算符清空,则发送不同的Flux Stream。