objects.requirenonnullelseget()是java 9引入的惰性求值方法,仅在参数为null时调用supplier获取默认值,确保返回非null且避免无谓计算。

Objects.requireNonNullElseGet() 是 Java 9 引入的工具方法,它能在对象为 null 时**延迟执行 Supplier 提供的默认值逻辑**,避免无谓的计算开销。相比 requireNonNullElse()(立即求值),它更适合需要按需初始化、资源敏感或可能抛异常的默认值场景。
核心用法:只在 null 时才调用 Supplier
该方法签名如下:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
它会先判断 obj 是否非 null;如果是,直接返回 obj;否则调用 supplier.get() 并返回其结果——且这个调用是惰性的,仅触发一次。
- ✅ 安全:若
supplier返回null,仍会抛出NullPointerException(符合“requireNonNull”语义) - ✅ 延迟:Supplier 中的逻辑(如数据库查询、文件读取、对象构造)不会在非 null 场景下执行
- ✅ 简洁:替代手动 if-null-then-get 的样板代码
典型适用场景举例
1. 配置项缺失时按需加载默认配置
比如从 Spring Environment 读取配置,若未设置,则解析 classpath 下的 fallback.yaml:
env.getProperty("app.config.json"),
() -> new String(Files.readAllBytes(Paths.get("fallback.yaml"))));
2. 缓存未命中时创建新实例
避免每次调用都 new 对象,仅在缓存为空时才构建:
cache.get(userId),
() -> User.builder().id(userId).status("active").build());
3. 处理可能为 null 的 Optional 或外部 API 结果
当上游返回可能为 null 的 Optional,又不想用 orElseGet() 混淆语义时:
Report report = Objects.requireNonNullElseGet(
reportOpt.orElse(null),
() -> generateDefaultReport());
与相似方法的关键区别
-
Objects.requireNonNullElse(a, b):b是立即求值的表达式,无论a是否为 null 都会执行(如new ExpensiveObject()总会构造) -
Optional.ofNullable(a).orElseGet(supplier):功能类似,但引入了 Optional 包装,语义侧重“存在性”,而requireNonNullElseGet更强调“非空契约 + 惰性兜底” -
Objects.requireNonNull(a, message):仅校验并抛异常,不提供默认值
注意事项与最佳实践
- Supplier 不应有副作用,除非你明确希望它只在 null 时发生(例如日志记录可接受,但修改全局状态需谨慎)
- 若 Supplier 可能抛受检异常,需在 lambda 内捕获并转为运行时异常,或改用自定义工具方法封装
- 不适合用于需要多次复用同一默认值的场景(因每次调用都会重新执行 supplier),此时应先缓存 supplier 结果再传入
- 方法名中的 “RequireNonNull” 是关键提示:它保证返回值绝不会是 null,违反则抛 NPE —— 所以 Supplier 必须返回非 null 值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










