Optional.ofNullable(obj).ifPresent(System.out::println) 一行实现非空打印,无需判空、无if语句、不抛异常;ifPresent是消费型终端操作,值存在时执行Consumer,返回void不可链式调用。

直接用 Optional.ofNullable(obj).ifPresent(System.out::println) 即可,无需判空、无 if 语句、不抛异常,一行完成“非空才打印”逻辑。
基础写法:一行搞定非空打印
ifPresent() 是 Optional 的消费型终端操作,只在值存在时执行指定的 Consumer。它天然规避了显式 null 检查:
-
✅ 正确(简洁安全):
Optional.ofNullable(user).ifPresent(u -> System.out.println("用户名:" + u.getName())); -
❌ 冗余(不推荐):
if (user != null) { System.out.println(...); } -
❌ 危险(NPE风险):
user.getName()直接调用(未包装成 Optional)
配合方法引用,进一步简化
当打印逻辑就是直接输出对象本身或其某个字段时,可用方法引用提升可读性:
- 打印整个对象:
Optional.ofNullable(user).ifPresent(System.out::println); - 打印某字段(需确保字段方法非 null 安全):
Optional.ofNullable(user).map(User::getEmail).ifPresent(System.out::println); - 组合使用(先取邮箱再打印):
Optional.ofNullable(user).map(User::getEmail).filter(Objects::nonNull).ifPresent(email -> System.out.println("邮箱:" + email));
注意边界:ifPresent 不支持返回值与链式延续
ifPresent() 返回 void,不能继续链式调用其他 Optional 操作(如 map、flatMap)。若需后续处理,应改用 map + ifPresent 或 orElse 等组合:
-
? 错误(编译失败):
Optional.ofNullable(user).ifPresent(...).map(...)——ifPresent无返回值 -
✅ 替代方案(想打印后取 name):
Optional.ofNullable(user).map(u -> { System.out.println(u); return u.getName(); }).ifPresent(System.out::println); -
✅ 更清晰的替代(分步):
Optional.ofNullable(user).ifPresent(u -> System.out.println(u));后接Optional.ofNullable(user).map(User::getName).ifPresent(...);
实际场景示例:处理可能为 null 的配置项
比如从 Spring Environment 获取配置,避免空指针同时保持代码干净:
String timeout = environment.getProperty("app.timeout");
Optional.ofNullable(timeout)
.map(Integer::parseInt)
.ifPresent(t -> System.out.printf("已加载超时配置:%d 秒%n", t));
这段代码自动跳过 null 或解析失败的情况(map 中抛异常会中断,但 ifPresent 不执行),真正做到了“有值才处理,没值就沉默”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











