Optional的正确用法
基础理解
首先,Optional
是一个容器,用于放置可能为空的值,它可以合理而优雅的处理null
。众所周知,null
在编程历史上极具话题性,号称是计算机历史上最严重的错误,感兴趣可以读一下这篇文章:THE WORST MISTAKE OF COMPUTER SCIENCE,这里暂且不做过多讨论。在 Java 1.8 之前的版本,没有可以用于表示null
官方 API,如果你足够的谨慎,你可能需要常常在代码中做如下的判断:
if (null != user) {
//doing something
}
if (StringUtil.isEmpty(string)) {
//doing something
}
确实,返回值是null
的情况太多了,一不小心,就会产生 NPE,接踵而来的就是应用运行终止,产品抱怨,用户投诉。
1.8 之后,jdk 新增了Optional
来表示空结果。其实本质上什么也没变,只是增加了一个表达方式。Optional
表示空的静态方法为Optional.empty()
,跟null
有什么本质区别吗?其实没有。翻看它的实现,Optional
中的 value 就是null
,只不过包了一层Optional
,所以说它其实是个容器。用之后的代码可能长这样:
// 1
Optional<User> optionalUser = RemoteService.getUser();
if (!optionalUser.isPresent()) {
//doing something
}
User user = optionalUser.get();
// 2
User user = optionalUser.get().orElse(new User());
看起来,好像比之前好了一些,至少看起来没那么笨。但如果采用写法 1,好像更啰嗦了。
下面先说一些在我看来不合适的使用方式:
Bad Practice
1. 直接使用 isPresent() 进行 if 检查
这个直接参考上面的例子,用if
判断和 1.8 之前的写法并没有什么区别,反而返回值包了一层Optional
,增加了代码的复杂性,没有带来任何实质的收益。其实isPresent()
一般用于流处理的结尾,用于判断是否符合条件。
list.stream()
.filer(x -> Objects.equals(x,param))
.