optional.ifpresentorelse是java 9引入的方法,有值时执行consumer操作、无值时执行runnable操作,仅用于副作用处理,不返回结果,不可用于赋值或取值。

Optional.ifPresentOrElse 是 Java 9 引入的方法,用于在 Optional 有值时执行一个 Consumer 操作,无值时执行一个 Runnable 操作,避免显式判空和重复写 if-else。
基本用法:两个分支各司其职
它接收两个参数:第一个是 有值时执行的 Consumer
- 有值:调用第一个函数,传入内部封装的值
- 无值:直接运行第二个 Runnable,不抛异常也不返回任何东西
典型场景:替代 if-else 判空逻辑
比如从 Map 中取值后分别处理存在/不存在的情况:
Map<string string> config = Map.of("timeout", "30");
Optional<string> timeoutOpt = Optional.ofNullable(config.get("timeout"));
timeoutOpt.ifPresentOrElse(
value -> System.out.println("使用配置值: " + value),
() -> System.out.println("未配置 timeout,采用默认值 60")
);</string></string>
相比传统写法:if (timeoutOpt.isPresent()) { ... } else { ... },更简洁且语义明确。
注意事项:不能用于获取或转换值
ifPresentOrElse 不返回结果,也不能中断流程或抛出受检异常。如果需要根据 Optional 状态返回不同值,应改用 map().orElse() 或 orElseGet();若需抛异常,可用 orElseThrow()。
- ❌ 错误:试图用它赋值或返回结果 —— 它的返回类型是 void
- ✅ 正确:只做日志、发通知、更新标志位、触发回调等无返回操作
与 orElse / orElseGet 的区别
ifPresentOrElse 关注“执行动作”,而 orElse 系列关注“提供默认值”。例如:
- 要打印日志并设置 flag → 用
ifPresentOrElse - 要获取一个字符串(有值用它,没值用默认)→ 用
orElse("default")
二者目的不同,不可互相替代,选哪个取决于你是否需要返回值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











