我有一个场景,第二个单声道依赖于第一个单声道,而 ThridMono 调用依赖于第二个单声道输出。
我写的代码如下。
firstMono.flatMap{
val secondMono = callWebservice(firstMono)
val thrirdMono = secondMono.flatMap { secondMonoResponse ->
if (secondMonoResponse.getName.equals("ABC")) {
callAnotherWebService(secondMon)
} else {
secondMono
}
}
}
我怎样才能避免这里出现第二个 flatMap?。有没有办法可以在没有嵌套的 flatMap 的情况下做到这一点。我应该只在满足条件的情况下调用 thrirdMono 。
答案可能会有所不同,具体取决于每个 Mono 的具体性能。 然而,当我查看代码片段时,我没有看到在第一个Mono上调用
flatMap{}
的意义,所以它可能看起来如下:
callWebservice(firstMono)
.flatMap { secondMonoResponse ->
if (secondMonoResponse.name == "ABC" ) {
callAnotherWebService(secondMono)
} else {
secondMono
}
}
另一方面,这里也可以使用 .zip 方法:
val secondMono = callWebservice(firstMono)
Mono.zip(firstMono, callWebservice(firstMono))
.flatMap {
val secondMonoResponse = it.t2
if (secondMonoResponse.name == "ABC" ) {
callAnotherWebService(secondMono)
} else {
secondMono
}
}
注意:我删除了
val thrirdMono
,因为上面的代码片段不会编译,因为返回类型是Unit(而不是Mono)。
你可以像这样做一个调用堆栈:
Mono<MonoCustom> thirdMono = firstMono.map(this::callWebservice)
.map(secondMonoResponse -> {
if (secondMonoResponse.getName().equalsIgnoreCase("ABC")) {
return callAnotherWebService(secondMonoResponse);
}
return secondMonoResponse;
});
所以结果会是这样的:
package com.example;
import reactor.core.publisher.Mono;
public class SomeClass {
private Mono<MonoCustom> getThirdMono(Mono<MonoCustom> firstMono) {
return firstMono.map(this::callWebservice)
.map(secondMonoResponse -> {
if (secondMonoResponse.getName().equalsIgnoreCase("ABC")) {
return callAnotherWebService(secondMonoResponse);
}
return secondMonoResponse;
});
}
private MonoCustom callWebservice(MonoCustom firstMonoResponse) {
return firstMonoResponse;
}
private MonoCustom callAnotherWebService(MonoCustom secondMonoResponse) {
return secondMonoResponse;
}
private static class MonoCustom {
private String name;
private MonoCustom(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
}