java 8 新特性,早就听说了,比如在java核心原理一书上面,讲到了安全获取还是缓获取来着,用Optional作为容器来装对象,让程序从我们不受控制的报空,变成受我们控制的null处理。
此次的目标是在原有的:听说过 的基础上,明白原理,知晓使用场景,融入自己的代码中。
jdk文档中的描述是:
我的理解:
optional就是一个手机壳,对象就是手机啦,optional提供的方法就是围绕手机壳到底套没套手机。
这样反正怎么都会拿到手机壳,而不用关心手机没有而导致的直接报错。
三个,分别的作用是
都是用于创建Optional对象的。
其实这三个方法就很有意思,不考虑后边的方法,单从创建来说,可以通过这三个创建方式来规定传入的值是否会为空,这样就可以避免一个可能为空的炸弹往后续的代码传递。
通用的:
挺有意思的方法,传入一个pridicate,如果成立就返回当前这个Optional (this),不成立返回一个empty的Optional。
如果传入的pridicate是null,会抛空指针。
public T get()
把值取出来啦,如果没得值会抛异常 `NoSuchElementException`
public <U> Optional<U> map(Function<? super T,? extends U> mapper)
老映射了,和stream的差别是它只针对一个值进行映射。
逻辑是如果Optional里面本身就没有值,就直接返回empty的optional
有值就执行传入的mapper方法,使用ofNullable()返回一个Optional。
也就是说map返回Optional是不保证空和非空的。
public <U> Optional<U> flatMap(Function<? super T,? extends Optional<? extends U>> mapper)
也是老映射了,和stream中的flagMap差别比较大。
和map的实现差别是,传入的mapper方法的返回值必须是一个Optional类型。
意思这玩意可以自己指定返回Optional的方式,而不像map是固定使用的ofNullAble,利用这点可以使用of静态方法保证返回值一定不为空。
检查是否存在的:
public boolean isPresent()
字面意思,看看有值没
public void ifPresent(Consumer<? super T> action)
如果有值,就执行action方法,没有值就不进行任何操作。
public T orElse(T other)
如果有值就返回,没有就返回other
眼熟不!!这不是咱常用的三元表达式呗
public T orElseGet(Supplier<? extends T> supplier)
如果存在值,则返回值,否则返回由供应函数产生的结果。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)throws X extends Throwable
如果存在值,则返回值,否则将抛出由异常提供函数产生的异常。
总结:
其实大部分的方法,就是结合java 8的函数式接口来对内部包含的值,到底为null不为null进行反反复复的鞭笞。
没有啥原理嘿嘿,就是一个泛型value,进行反反复复的整。
在网上看到一个观点,是尽量不要主动去判断Optional对象中是否有值,比如get()、isPresent()方法,我觉得是挺正确的(最开始是想去反驳的哈哈哈
结合了一下Optional提供的方法思考,Optional提供的方法都是让我们去避免,关注Optional对象中是否有值,而是不管Optional中的值是否存在的逻辑用代码去规避,而不是断言。
比如orElse\ifPresent等,都是关注假定存在该如何,不存在该如何。
所以我的想法是,如果使用Optional类时,咱的编程思维应该改变,不是去if、else判断Optional的值是否存在,而是在编写逻辑上包含两种情况。
此外,Optional类中提供的方法很适合Stream式的变成,对单一个值的处理会相当的棒,这就是它的应用场景。
因篇幅问题不能全部显示,请点此查看更多更全内容