使用Optional.ofNullable(obj).ifPresent(action)可一行实现“对象非空即执行”,避免空指针;其基于Consumer接口,仅在值非空时调用,不返回结果,适用于无返回值的副作用操作。

直接用 Optional.ofNullable(obj).ifPresent(action) 即可实现“对象非空即执行”的一行逻辑,无需 if 判断,也避免空指针。
核心写法与原理
ifPresent() 是 Optional 的终端操作方法,只在内部值非空时才调用传入的 Consumer。它本身不返回值(void),天然适合“有则执行、无则跳过”的场景。
-
基础模板:
Optional.ofNullable(可能为 null 的对象).ifPresent(要执行的操作); -
注意:必须用
ofNullable(),不能用of(),否则 null 会抛NullPointerException -
操作类型:参数是
Consumer<T>,支持方法引用、Lambda 或已有 Consumer 实例
常见实用写法示例
✅ 安全调用实例方法:
Optional.ofNullable(user).ifPresent(u -> System.out.println(u.getName()));
✅ 复用已有方法(方法引用):
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Optional.ofNullable(config).ifPresent(this::loadFromConfig);
✅ 更新集合或状态(无返回值操作):
Optional.ofNullable(orderId).ifPresent(orders::remove);
对比传统写法,优势在哪?
传统方式需显式判空,代码冗长且易漏:
if (user != null) {
System.out.println(user.getName());
}
而 Optional 写法更简洁、意图更明确,且天然防御 NPE;尤其在链式调用或函数式风格中,可与其他 Optional 操作(如 map、filter)自然衔接。
注意事项与边界情况
⚠️ 不适用于需要返回值或抛异常的场景 —— ifPresent() 是消费型操作,无法中断流程或获取结果。
- 若需“非空则返回某值”,改用
map().orElse(...) - 若需“非空则计算并可能抛异常”,建议用
if (obj != null) { ... }显式控制 - 避免在
ifPresent()中写复杂多行逻辑,保持语义清晰;必要时提取为独立方法

















