Java8特性中的Optional
可以用来优雅的判空,Optional
来自官方的介绍如下:
A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.
一个可能包含也可能不包含非null
值的容器对象。 如果存在值,isPresent()
将返回true
,get()
将返回该值。
如下代码,需要获得Test2
中的Info
信息,但是参数为Test4
,我们要一层层的申请,每一层都获得的对象都可能是空,最后的代码看起来就像这样。
public String testSimple(Test4 test) { |
使用Optional
:
public String testOptional(Test test) { |
1、Optional.ofNullable(test)
,如果test为空,则返回一个单例空Optional
对象,如果非空则返回一个Optional
包装对象,Optional
将test
包装;
public static <T> Optional<T> ofNullable(T value) { |
2、flatMap(Test::getTest3)
判断test
是否为空,如果为空,继续返回第一步中的单例Optional
对象,否则调用Test
的getTest3
方法;
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { |
3、flatMap(Test3::getTest2)
同上调用Test3
的getTest2
方法;
4、map(Test2::getInfo)
同flatMap
类似,但是flatMap
要求Test3::getTest2
返回值为Optional
类型,而map
不需要,flatMap
不会多层包装,map返回会再次包装Optional
;
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { |
5、orElse("");
获得map
中的value
,不为空则直接返回value
,为空则返回传入的参数作为默认值。
public T orElse(T other) { |
使用Optional
后的代码是不是瞬间变得非常整洁,或许看到这段代码你会有很多疑问,针对复杂的一长串判空,Optional有它的优势,但是对于简单的判空使用Optional
也会增加代码的阅读成本、编码量以及团队新成员的学习成本。毕竟Optional
在现在还并没有那样流行,它还拥有一定的局限性。