在 Java 8 引入 Optional<T> 之后,官方和社区都推荐用 Optional 来表达“可能为空的值”,核心原因可以总结为一句话:
Optional 不是用来避免 NullPointerException 的“银弹”,而是用来在类型层面明确表达“值可能不存在”这一语义。
下面从几个关键角度说明为什么推荐用 Optional。
User getUserById(Long id); // 可能返回 null
调用者不知道会不会返回 null,只能:
User user = getUserById(1);
if (user != null) {
...
}
一旦忘记判空,就 NPE。
Optional<User> getUserById(Long id);
编译器在逼迫你思考“值可能不存在”这件事。
Optional<User> userOpt = getUserById(1);
userOpt.ifPresent(user -> {
System.out.println(user.getName());
});
相比:
User user = getUserById(1);
if (user != null) {
System.out.println(user.getName());
}
Optional 把“是否存在”这个逻辑显式表达出来,而不是藏在 null 里。
String city = getUserById(1)
.flatMap(User::getAddress)
.map(Address::getCity)
.orElse("Unknown");
等价于一堆嵌套 if (x != null),但:
在 Java 中,null 往往有多种含义:
Optional.empty() 的语义是唯一的:
“没有值”
官方明确建议:
Optional<User> findUser(String name);
void process(Optional<User> user); // 多余
class User {
Optional<Address> address; // 不推荐
}
很多人误解 Optional:
❌ 错误认知:
✅ 正确认知:
以下场景通常不推荐:
class User {
String name; // 推荐
}
void foo(Optional<String> s); // 不推荐
List<Optional<User>> // 非常不推荐
✅ 用 List<User> + 空集合更好
Java 推荐用 Optional,是为了让“可能为空”从运行时隐患,变成编译期可读的语义。
如果你愿意,我可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。