You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以响应式方式将两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:19:14