ifpresentorelse是java 9引入的二元动作方法,值存在时执行consumer(传入值),为空时执行runnable(无参),语义明确、原子安全、避免手动判空和重复求值,适用于日志、通知、状态更新等副作用操作。

Java 9 引入了 ifPresentOrElse,专为“有值就干 A,没值就干 B”这种二分逻辑设计。它比手动写 if (opt.isPresent()) 更简洁、语义更明确,且避免重复求值和并发场景下的潜在风险。
基础用法:两个参数必须都给
该方法接收两个参数:
- 第一个是
Consumer<t></t>:值存在时执行,会把实际值传进去 - 第二个是
Runnable:值为空(Optional.empty())时执行,不带参数、无返回
示例:
Optional
name.ifPresentOrElse(
n -> System.out.println("欢迎:" + n),
() -> System.out.println("访客,请登录")
);
典型适用场景:专注副作用操作
它适合做“动作”,不适合做“计算”。常见用途包括:
- 查到用户 → 写入缓存;没查到 → 记一条缺失日志
- 配置存在 → 加载进内存;配置缺失 → 触发告警通知
- 订单数据就绪 → 启动结算流程;数据为空 → 标记任务失败
注意:不要在 lambda 里返回对象或试图赋值,因为方法本身返回 void。
容易踩的坑
几个高频错误点要避开:
- 把第二个参数写成
v -> log.warn(v)或System.out::println—— 编译报错,因为Runnable不接受参数 - 调用前没确认
Optional对象本身非 null —— 会直接抛NullPointerException - 空分支中用了外部变量(如
id),但没确保它非 null —— 可能导致空指针,建议用Objects.requireNonNullElse(id, "N/A")包一层
版本与环境确认
这个方法只在 Java 9 及以上可用:
- 运行
java -version确保输出 ≥ 9(如 11、17、21) - Maven 项目需在
pom.xml中设置<source>9</source>和<target>9</target> - IDE 需配置对应 JDK 版本,否则编辑器会标红提示找不到方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











