ifPresent 是 Optional 的终端消费方法,仅在值非空时执行 Consumer 逻辑,自动判空且不抛异常;适用于日志、通知等无返回值副作用操作,不可链式调用,空值时静默跳过。

ifPresent 是 Optional 的一个方法,用来在 Optional 包含非 null 值时执行一段逻辑,值为空(即 empty)时什么也不做,避免了显式判空和 NullPointerException。
基本用法:传入 Consumer 函数式接口
ifPresent 接收一个 Consumer<T> 类型的参数,也就是一个“消费”值的无返回值操作。它只在 Optional 有值时调用该操作。
- 写法示例:
optional.ifPresent(x -> System.out.println("值是:" + x)); - 等价于传统写法:
if (optional.isPresent()) { System.out.println("值是:" + optional.get()); },但更简洁、更安全 - 注意:不能在 lambda 中直接 return 或 throw(除非抛出运行时异常),因为它本身不返回任何东西
常见使用场景
适合做“有值才触发”的副作用操作,比如日志、修改状态、发通知、更新 UI 等。
- 打印日志:
userOptional.ifPresent(user -> log.info("用户已登录:{}", user.getName())); - 设置字段:
configOptional.ifPresent(config -> this.timeout = config.getTimeout()); - 调用外部服务:
tokenOptional.ifPresent(token -> authService.revoke(token));
不能替代 map/flatMap 或 filter
ifPresent 只用于执行动作,不产生新 Optional,也不支持链式转换。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误用法:
optional.ifPresent(x -> x.toString()).orElse("default")—— ifPresent 返回 void,无法链式调用 - ✅ 想转换值请用 map:
optional.map(String::toUpperCase).orElse("empty") - ✅ 想过滤再处理请用 filter + ifPresent:
optional.filter(s -> s.length() > 5).ifPresent(System.out::println);
和 ifPresentOrElse 的区别
Java 9 新增了 ifPresentOrElse,支持“有值执行 A,没值执行 B”:
optional.ifPresentOrElse(x -> System.out.println(x), () -> System.out.println("为空"));- ifPresent 只管“有值时做什么”,else 部分需额外判断,比如用 isPresent + else 块


















