java.util.Optional 的出现,主要是为了解决 NullPointerException(NPE) 和 表达“值可能不存在”这一语义 的问题。可以从背景、设计动机和设计思想三方面来看。
在 Java 8 之前:
String name = user.getAddress().getCity().getName();
只要中间任何一个对象是 null,就会抛出:
NullPointerException
问题包括:
null 到底是“没查到”?“出错了”?“还没初始化”?说不清nullUser,你不知道它是不是可能返回 nullJava 8 引入 Optional<T>,核心目的不是“替代 null”,而是:
用类型系统明确表达“可能没有一个值”
Optional<User> findUserById(Long id);
调用者一眼就知道:
而不是:
User findUserById(Long id); // 可能返回 null,但不说
Optional<User> userOpt = findUserById(1L);
userOpt.ifPresent(u -> System.out.println(u.getName()));
相比:
User u = findUserById(1L);
if (u != null) {
System.out.println(u.getName());
}
Optional 鼓励你:
ifPresentorElsemap / flatMap而不是随手写 .get()(这是不推荐的)
Java 8 引入 Lambda / Stream,Optional 与其配合:
Optional<String> city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity);
避免层层 null 判断。
很重要的一点:
Optional 不是用来替代所有 null 的
Optional<User> 作为字段)Optional 做参数)Optional<List>)Optional 的出现,是为了在类型层面表达“值可能不存在”,从而让空值处理更安全、更清晰、更函数式。
如果你愿意,我也可以对比 Optional 和 Kotlin 的 ?、或者讲 Optional 的常见误用。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。