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) {
if (test == null) {
return "";
}
if (test.getTest3() == null) {
return "";
}
if (test.getTest3().getTest2() == null) {
return "";
}
if (test.getTest3().getTest2().getInfo() == null) {
return "";
}
return test.getTest3().getTest2().getInfo();
}
使用Optional
:
public String testOptional(Test test) {
return Optional.ofNullable(test).flatMap(Test::getTest3)
.flatMap(Test3::getTest2)
.map(Test2::getInfo)
.orElse("");
}
1、Optional.ofNullable(test)
,如果test为空,则返回一个单例空Optional
对象,如果非空则返回一个Optional
包装对象,Optional
将test
包装;
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
2、flatMap(Test::getTest3)
判断test
是否为空,如果为空,继续返回第一步中的单例Optional
对象,否则调用Test
的getTest3
方法;
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
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) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
5、orElse("");
获得map
中的value
,不为空则直接返回value
,为空则返回传入的参数作为默认值。
public T orElse(T other) {
return value != null ? value : other;
}
使用Optional
后的代码是不是瞬间变得非常整洁,或许看到这段代码你会有很多疑问,针对复杂的一长串判空,Optional有它的优势,但是对于简单的判空使用Optional
也会增加代码的阅读成本、编码量以及团队新成员的学习成本。毕竟Optional
在现在还并没有那样流行,它还拥有一定的局限性。
文章内容来源
- http://blog.imuxuan.com
- Java知音 微信公众号

相关推荐
版权声明
- 本文链接: https://www.cayzlh.com/2018/11/24/cdbc6817.html
- 版权声明: 文章内容仅用作学习和分享,如有雷同,纯属拷贝。
留言区