ifPresentOrElse是Java 9新增方法,用于值存在时执行Consumer、为空时执行Runnable,语义明确且避免手动判空;要求JDK≥9,且需确保Optional对象本身非null。

直接用 ifPresentOrElse 就行,它专为“有值干啥、没值干啥”这种二分场景设计,比手动写 if (opt.isPresent()) 更简洁,语义也更明确。
基础写法:两个分支必须类型匹配
它接收两个参数:第一个是 Consumer(值存在时执行,带参数),第二个是 Runnable(值为空时执行,无参无返回)。
- ✅ 正确示例:
optional.ifPresentOrElse(v -> System.out.println("Got: " + v), () -> System.out.println("Empty")) - ❌ 常见错误:把第二个参数也写成
Consumer,比如传System.out::println或v -> log.warn(v),编译直接报错——因为Runnable不接受参数,也不能返回值。
适用场景:专注副作用,不返回结果
这个方法只适合做“动作”,不是“计算”。适合的典型操作包括:
- 发欢迎邮件(有用户) / 记告警日志(无用户)
- 更新缓存状态(有配置) / 上报缺失指标(无配置)
- 标记任务完成(有结果) / 设置失败标志(无结果)
如果需要返回对象、抛受检异常、或做多步条件判断,就别硬套——改用 isPresent() + get() 或传统 if-else 更清晰。
避坑要点:空指针风险不自动屏蔽
ifPresentOrElse 只保证 Optional 本身非空,不保护你 lambda 里引用的外部变量。
- 比如:
opt.ifPresentOrElse(n -> System.out.println(n.length()), () -> System.out.println(defaultName.length()))—— 若defaultName是null,第二支会直接抛NullPointerException。 - 解决办法:兜底逻辑中用到的变量,得自己提前判空,或用
Objects.requireNonNullElse(defaultName, "N/A")包一层。
版本与环境确认不能跳过
这个方法是 Java 9 新增的,低版本会编译失败。
- 检查 JDK 版本:
java -version输出至少为9或更高(如11、17) - Maven 项目需确保
pom.xml中和设为9或以上 - 注意:它不处理外层
Optional为null的情况。调用前仍要确保 optional 对象本身不为null,否则抛NullPointerException。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











