在项目中我们是用Optional 来判空的。
我们通常的做法,是先判断不为空,再遍历:
这样看 你是不是会觉得比较优雅?
1. 传统的判空?
假设有一个用户信息类,它有个地址属性。
要获取用户地址的城市,会有这样的代码:
一般我们可以这样处理:
使用Optional类
可能第一眼看那个Optional
优化后的代码有点生疏。多用用就会觉得很nice!
2. 常用API简介
2.1 ofNullable(T value)、empty()、of(T value)
上面使用到了 Optional.ofNullable(T value)
,看源码:
很明显!如果value
为null,就返回 empty()
,否则返回 of(value)
函数。
那我们看看Optional的empty()
和 of(value)
函数
显然, empty()
函数的作用就是返回EMPTY
对象。
而of(value)
函数会返回Optional的构造函数
对于 Optional的构造函数:
- 当value值为空时,会报
NullPointerException
。 - 当value值不为空时,能正常构造
Optional
对象。
2.2 orElseThrow(Supplier<? extends X> exceptionSupplier)、orElse(T other) 、orElseGet(Supplier<? extends T> other)
上面的例子,我们用到了orElseThrow
那我们先来介绍一下它吧:
很简单就是,如果value
不为null
,就返回value。
否则,抛出函数式exceptionSupplier
的异常。
一般情况,跟orElseThrow
函数功能相似的还有orElse(T other)
和 orElseGet(Supplier<? extends T> other)
对于orElse
,如果value
不为null
,就返回value
,否则返回 other
。
对于orElseGet
,如果value
不为null
,就返回value
,否则返回执行函数式other
后的结果。
2.3 map 和 flatMap
我们上面的例子,使用到了map(Function<? super T, ? extends U> mapper)
我们先来介绍一下它:
其实这段源码很简单,先是做个空值检查,接着就是value的存在性检查,最后就是应用函数并返回新的Optional
跟.map
相似的,还有个flatMap
,如下:
可以发现,它两差别并不是很大,主要就是体现在入参所接受类型不一样。
2.4 isPresent 和ifPresent
有些时候,会使用到isPresent
和ifPresent
,一个就是判断value值是否为空,另外一个就是判断value值是否为空,再去做一些操作。
比如ifPresent:
即判断value值是否为空,然后做一下函数式的操作。
用了isPresent
可以优化为:
感觉咋样?优雅吗?
最后说一句(求关注!别白嫖!)
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!