如何以响应式方式将两个Mono<Double>结果相乘并返回新Mono?
如何响应式合并两个Mono结果并相乘?
嗨,这个需求在Reactor响应式编程里很容易实现,主要用到**zip或者zipWith**操作符,它们都能帮你等待两个Mono完成后合并结果,再做计算。下面给你两种常用的实现方式:
方法1:使用Mono.zip + map
zip操作符会等待所有传入的Mono都成功完成,然后把它们的结果封装成一个Tuple对象,接着你可以用map从Tuple里取出两个值相乘:
public Mono<Double> calculate(OperandDto dto) { Mono<Double> dbResult1Mono = mongoReactRepo.findByMyLogic(dto); Mono<Double> dbResult2Mono = mongoReactRepo.findByMyOtherLogic(dto); return Mono.zip(dbResult1Mono, dbResult2Mono) .map(tuple -> tuple.getT1() * tuple.getT2()); }
方法2:使用zipWith(更简洁)
zipWith是zip的变体,你可以直接传入一个BiFunction来处理两个结果,省去了处理Tuple的步骤,代码更紧凑:
public Mono<Double> calculate(OperandDto dto) { Mono<Double> dbResult1Mono = mongoReactRepo.findByMyLogic(dto); Mono<Double> dbResult2Mono = mongoReactRepo.findByMyOtherLogic(dto); return dbResult1Mono.zipWith(dbResult2Mono, (result1, result2) -> result1 * result2); }
额外注意:处理空值/异常情况
如果你的数据库查询可能返回空(比如Mono.empty()),直接相乘会触发NullPointerException。你可以用defaultIfEmpty给空结果设置默认值,避免报错:
public Mono<Double> calculate(OperandDto dto) { Mono<Double> dbResult1Mono = mongoReactRepo.findByMyLogic(dto) .defaultIfEmpty(0.0); // 空值时用0.0代替 Mono<Double> dbResult2Mono = mongoReactRepo.findByMyOtherLogic(dto) .defaultIfEmpty(0.0); return dbResult1Mono.zipWith(dbResult2Mono, (r1, r2) -> r1 * r2); }
这样不管哪个Mono没有返回结果,都会用0.0参与计算,保证程序不会崩溃。
内容的提问来源于stack exchange,提问作者Lovi
相关产品推荐
相关产品推荐

