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

Mono.defaultIfEmpty()与Mono.switchIfEmpty()对比及懒加载疑问

关于Reactor中Mono.defaultIfEmpty()的求值逻辑与懒加载实现

问题1:Mono.defaultIfEmpty()是否和switchIfEmpty()一样是饿汉式求值?

不一样,两者的参数类型决定了求值逻辑的差异:

  • switchIfEmpty()接收的是Mono(Publisher类型),如果直接传入已创建的Mono实例,订阅阶段就会触发这个Mono的执行逻辑,也就是所谓的饿汉式求值。
  • defaultIfEmpty()的参数是具体的业务对象(比如字符串、自定义POJO),而非Publisher。它只是提前存储这个对象,只有当上游Mono确实返回空值时,才会把该对象作为结果返回。不存在“求值触发时机”的问题,因为对象本身已经创建完成,只是在需要时取出使用。

问题2:如何让Mono.defaultIfEmpty()实现懒加载?

defaultIfEmpty()的设计本身只支持预先创建好的固定值,没法直接修改它实现懒加载。要达成“仅上游为空时才创建默认值”的效果,应该用Mono.defer()配合switchIfEmpty()来替代,示例代码如下:

// 可能返回空的上游Mono
Mono<String> upstream = Mono.empty();

// 懒加载默认值:仅上游为空时才执行默认值创建逻辑
Mono<String> result = upstream.switchIfEmpty(Mono.defer(() -> {
    // 这里写默认值的创建逻辑,比如数据库查询、接口调用等
    String defaultValue = createDefaultValue();
    return Mono.just(defaultValue);
}));

Mono.defer()会把默认值的创建逻辑包装起来,只有当上游确实为空时,才会触发lambda表达式里的创建逻辑,从而实现懒加载。

内容的提问来源于stack exchange,提问作者hadoobidoop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:10:53