Optional.ifPresentOrElse是Java 9引入的方法,有值时执行Consumer操作、无值时执行Runnable操作,仅用于副作用处理,不返回结果,不可用于赋值或取值。

Optional.ifPresentOrElse 是 Java 9 引入的方法,用于在 Optional 有值时执行一个 Consumer 操作,无值时执行一个 Runnable 操作,避免显式判空和重复写 if-else。
基本用法:两个分支各司其职
它接收两个参数:第一个是 有值时执行的 Consumer<T>(接受值本身),第二个是 无值时执行的 Runnable(不传参)。注意:两者不能返回值,仅用于副作用操作(如打印、记录、修改状态等)。
- 有值:调用第一个函数,传入内部封装的值
- 无值:直接运行第二个 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")
);
相比传统写法:if (timeoutOpt.isPresent()) { ... } else { ... },更简洁且语义明确。
立即学习“Java免费学习笔记(深入)”;
注意事项:不能用于获取或转换值
ifPresentOrElse 不返回结果,也不能中断流程或抛出受检异常。如果需要根据 Optional 状态返回不同值,应改用 map().orElse() 或 orElseGet();若需抛异常,可用 orElseThrow()。
- ❌ 错误:试图用它赋值或返回结果 —— 它的返回类型是 void
- ✅ 正确:只做日志、发通知、更新标志位、触发回调等无返回操作
与 orElse / orElseGet 的区别
ifPresentOrElse 关注“执行动作”,而 orElse 系列关注“提供默认值”。例如:
- 要打印日志并设置 flag → 用
ifPresentOrElse - 要获取一个字符串(有值用它,没值用默认)→ 用
orElse("default")
二者目的不同,不可互相替代,选哪个取决于你是否需要返回值。


















