在 Java(以及很多其他语言)里,Optional 和**传统判空(if != null)**的核心区别可以从「目的、可读性、安全性、使用场景」几个角度看。
写法:
User user = getUser();
if (user != null) {
Address address = user.getAddress();
if (address != null) {
System.out.println(address.getCity());
}
}
特点:
NullPointerExceptionnull 到底表示“没有值”还是“出错了”?写法:
Optional<User> userOpt = getUser();
userOpt
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(System.out::println);
特点:
| 对比项 | 传统判空 | Optional |
|---|---|---|
| 语义 | 隐式 | 显式 |
| 可读性 | 嵌套多时差 | 链式更清晰 |
| 安全性 | 靠人自觉 | 编译期提醒 |
| 性能 | 更好 | 略差 |
| 适用层级 | 任意代码 | 推荐用于返回值 |
Optional<User> findUserById(Long id);
Optional<Config> getConfig();
list.stream()
.filter(u -> u.isActive())
.findFirst()
.ifPresent(this::notify);
class User {
Optional<Address> address; // 不推荐
}
void process(Optional<User> user) // 不推荐
if (opt.isPresent()) {
opt.get(); // 等于没用 Optional
}
传统判空是“防御”
Optional 是“表达意图”
最佳实践:
如果你愿意,我可以给你一个 “什么时候必须用 Optional”的清单,或者对比 Java / Kotlin / Swift 的空安全设计。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。