求助:如何将Mono<Boolean>列表归约为单个Mono<Boolean>?
解决Mono列表归约为单个Mono的方法
你的代码里直接对List<Mono<Boolean>>调用reduce()是Kotlin集合的普通reduce方法,无法处理响应式流的合并逻辑。下面是几种基于Reactor框架的可行方案:
方法1:使用Flux.concat + all(短路验证)
如果需要只要有一个验证失败就立即终止并返回false,可以用这个方案,它会短路处理,不需要等待所有Mono完成:
fun isValid(value: Int): Mono<Boolean> { return Mono.just(true) } fun checkValue(): Mono<Boolean> { val times = listOf(5, 10) return Flux.fromIterable(times) .flatMap { isValid(it) } .all { it } // 所有元素为true时返回true,否则false,且短路 }
方法2:使用Mono.zip(等待所有结果后验证)
如果需要等待所有Mono执行完成后再统一判断结果,不管中间是否有失败,可以用Mono.zip合并所有结果后检查:
fun isValid(value: Int): Mono<Boolean> { return Mono.just(true) } fun checkValue(): Mono<Boolean> { val monos = listOf(5, 10).map { isValid(it) } return Mono.zip(monos) { results -> // 遍历所有合并结果,确认全部为true results.all { result -> result is Boolean && result } } }
方法3:使用Flux.reduce(累积式归约)
这种方式会逐步累积验证结果,同样需要等待所有Mono完成,逻辑上和方法2类似,但通过归约操作实现:
fun isValid(value: Int): Mono<Boolean> { return Mono.just(true) } fun checkValue(): Mono<Boolean> { val times = listOf(5, 10) return Flux.fromIterable(times) .flatMap { isValid(it) } .reduce(true) { accumulated, current -> accumulated && current } }
方案对比
- 方法1(all):性能最优,适合需要快速失败的场景;
- 方法2(zip):可以获取到所有验证的结果(如果需要后续处理),但必须等待全部完成;
- 方法3(reduce):逻辑更直观,逐步累积结果,同样需要等待全部完成。
内容的提问来源于stack exchange,提问作者Tharindu Kumara
相关产品推荐
相关产品推荐

