ifPresent 是 Optional 的消费方法,值非 null 时执行 Consumer 逻辑,为空则跳过;返回 void,不支持链式获取结果或抛受检异常,适用于“有则处理、无则忽略”场景。

ifPresent 是 Optional 类提供的一个方法,用于在封装的值**非 null**(即存在)时,执行一段消费逻辑(Consumer),值不存在(Optional.empty())则什么也不做。
核心用法:传入 Consumer 函数式接口
它接收一个 Consumer<T> 参数,该接口只有一个 accept(T t) 方法,用来处理实际存在的值:
- 如果
Optional包含非 null 值,就调用accept(),把值传进去执行逻辑 - 如果
Optional是空的(empty()),直接跳过,不抛异常、不执行任何操作
典型写法示例
比如从 Map 中安全获取一个可能为 null 的字符串,并在它存在时打印长度:
Optional<String> optStr = Optional.ofNullable(map.get("name"));
optStr.ifPresent(s -> System.out.println("长度:" + s.length()));
等价于但更简洁的写法(推荐):
立即学习“Java免费学习笔记(深入)”;
Optional.ofNullable(map.get("name"))
.ifPresent(s -> System.out.println("长度:" + s.length()));
常见误区提醒
-
不能获取返回值:ifPresent 返回 void,无法链式获取处理结果;如需转换或返回新值,改用
map()或flatMap() - 不能抛受检异常:lambda 里若要 throw 检查型异常(如 IOException),需自行包装成 RuntimeException,或改用传统 if 判断
-
不是替代 if-else 的万能方案:它只适合“有就做,没有就不管”的场景;需要 else 分支时,仍应使用
isPresent() + get()或orElse()/orElseGet()
和传统 null 检查对比
以下两段逻辑等价,但后者更直观、前者更函数式:
// 传统方式
String name = map.get("name");
if (name != null) {
System.out.println("长度:" + name.length());
}
// 使用 ifPresent
Optional.ofNullable(map.get("name"))
.ifPresent(name -> System.out.println("长度:" + name.length()));
优势在于避免显式 null 判断,语义更清晰——你关注的是“值存在时做什么”,而不是“怎么防空指针”。


















