我想合并两个结果 Mono
基于某种条件。两者 Mono
是 WebClient
的结果调用:
“取消”第二个想法
Mono
如果第一个结果满足某些条件以节省时间并避免不必要的网络调用。如果第一个的Mono
结果不够zip
它与第二个 Mono
.一个 Kotlin 代码示例来解释我的想法:
fun getResult(): Mono<Result> {
val trivialResultMono: Mono<Result> = webClient.getResult()
val nonTrivialResultMono: Mono<Result> = webClient
.getResult()
.flatMap { webClient.getResult1(it) }
.flatMap { webClient.getResult2(it) }
.flatMap { webClient.getResult2(it) }
//here I need to check if trivial result satisfies some condition,
//for example trivialResult.size > 5 if it's true I just return
//trivialResultMono from getResult() function,
//it it's false something like this:
return Mono.zip(trivialResultMono, nonTrivialResultMono) { trivialResult, nonTrivialResult ->
trivialResult + nonTrivialResult
}
}
更新:
为了更清楚,我们假设 trivialResult 在 1 秒内出现,nonTrivialResult 在 2 秒内出现。我想在
trivialResult.size > 5
的情况下在 1 秒内得到我的最终结果否则在 2 秒内。仅使用
Mono.zip(trivialResultMono, nonTrivialResultMono)
我总是会在 2 秒内得到我的最终结果。使用
filter + switchIfEmpty
如果 trivialResult.size > 5
需要 1 秒否则为 3 秒。如果我错了,请纠正我。
最佳答案
您可以过滤您的 trivialResultMono
并申请 switchIfEmpty
运算符(operator)
return trivialResultMono
.filter(trivialResult -> trivialResult.size > 5)
.switchIfEmpty(Mono.zip(...))
更新
merge
方法:Mono<Result> zipResultMono = Mono.zip...
return Flux.merge(
trivialResultMono.map(trivialResult -> Tuples.of(1, trivialResult)),
zipResultMono.map(zipResult -> Tuples.of(2, zipResult)))
.filter(tuple ->
(tuple.getT1().equals(1) && tuple.getT2().size > 5) ||
tuple.getT1().equals(2))
.next()
.map(Tuple2::getT2);
如果 zipResult 的大小总是大于 5,您可以跳过转换为 Tuple2
关于reactive-programming - 有条件的两个 Mono 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56148491/