Optional.ifPresent()在值非空时执行Consumer逻辑,为空则忽略;接收Consumer参数,支持Lambda和方法引用,不返回值,适用于“有则处理、无则忽略”场景。

Optional.ifPresent() 是 Java 8 引入的便捷方法,用于在 Optional 包装的对象**非空(即存在值)时执行一段消费逻辑(Consumer)**,如果为空则什么也不做,避免了显式判空和 if 语句。
基本用法:传入一个 Consumer 函数
ifPresent 接收一个 Consumer
- ✅ 正确写法(Lambda 表达式):
optional.ifPresent(value -> System.out.println("获取到值:" + value));
- ✅ 正确写法(方法引用):
optional.ifPresent(System.out::println);
- ❌ 错误写法(不能直接写语句块,必须是表达式或方法引用):
optional.ifPresent({ System.out.println("xxx"); }); // 编译不通过
典型使用场景
常用于替代传统判空后处理的模板代码,让逻辑更简洁、意图更清晰。
- 处理可能为 null 的方法返回值(如 Map.get()、Stream.findFirst()):
Optional
nameOpt.ifPresent(name -> sendWelcomeEmail(name));
- 配合 Stream API 使用(findFirst、findAny 等返回 Optional):
Optional
.filter(u -> "ADMIN".equals(u.getRole()))
.findFirst();
admin.ifPresent(u -> log.info("找到管理员:{}", u.getUsername()));
注意事项
- ifPresent 不返回值(void 方法),无法链式后续操作;如需转换或过滤,请用 map/flatMap/filter
- 它只适用于“**有就做点事,没有就忽略**”的场景;若需要“有就做A,没有就做B”,应使用 ifPresentOrElse(Java 9+)或 isPresent() + else
- 不要在 ifPresent 内部修改外部变量(除非是 effectively final),否则易引发理解偏差或并发问题
对比传统写法
不用 Optional:
String name = user.getName();
if (name != null) {
System.out.println("获取到值:" + name);
}
用 ifPresent:
Optional.ofNullable(user.getName())
.ifPresent(name -> System.out.println("获取到值:" + name));
语义更聚焦于“值存在时的消费行为”,且天然免疫 NPE。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











