这是样板代码:我想做这样的事情-
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。否则返回空的助焊剂。
要注意的指针是-
它没有到达第二个方法调用
由于一种方法是Mono,另一种方法是Flux,所以如果我直接在第2行中添加return,则类型不匹配。
我在method1中尝试过此方法:
if(Object1.id().isEmpty()){
throw new IllegalArgumentException;
}
以及上面的代码片段:
try {
method1(email);
} catch(IllegalArgumentException e) {
return method2(email);
}
从不捕获异常。
答案 0 :(得分:2)
您的第一个代码段不应编译,因为该方法的实现未调整任何内容,因此,我将尝试猜测发生了什么。
这里什么也没有发生,因为该方法未返回您正在创建的发布者。 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
将帮助您在此处将结果转换为预期的回报类型。
答案 1 :(得分:1)
您应该使用switchIfEmpty()运算符。
此外,如果要从方法中返回两种类型(Mono以及Flux),则将返回类型更改为org.reactiveStreams.Publisher。我不会推荐这个。
返回磁通量。即使仅返回1个数据,也可以将其作为Flux返回。 将Mono转换为Flux,如果用户为空,则将其转换为switchIfEmpty运算符,以发送不同的Flux流。