java8 不会就out了(三)使用Optional来代替你的空判断

目标(为什么要学)

java 8 新特性,早就听说了,比如在java核心原理一书上面,讲到了安全获取还是缓获取来着,用Optional作为容器来装对象,让程序从我们不受控制的报空,变成受我们控制的null处理。

此次的目标是在原有的:听说过 的基础上,明白原理,知晓使用场景,融入自己的代码中。

作用(能干啥)

jdk文档中的描述是:

  1. optional是一个基础容器对象,用来储存可能包含也可能不包含非null值的对象。

  1. 提供访问容器储存对象的方法:
    • 如果isPresent()方法返回true,代表容器储存的值不为null
    • 提供一些依赖于值存在或者值不存在的附加方法:如orElse() 如果没有值则返回默认值,ifPresent() 如果值存在则执行方法。
  1. Optional主要作用在方法的返回类型
  2. Optional变量本身不应该为NULL

我的理解:

optional就是一个手机壳,对象就是手机啦,optional提供的方法就是围绕手机壳到底套没套手机。

这样反正怎么都会拿到手机壳,而不用关心手机没有而导致的直接报错。

 

场景(能咋用)

  1. 静态方法

三个,分别的作用是

  • empty()直接返回空optional
  • 不允许接收null的of(t),
  • 允许接收null到ofNullable(T)

都是用于创建Optional对象的。

其实这三个方法就很有意思,不考虑后边的方法,单从创建来说,可以通过这三个创建方式来规定传入的值是否会为空,这样就可以避免一个可能为空的炸弹往后续的代码传递。

  1. 接口方法

通用的:

public Optional<T> filter​(Predicate<? super T> predicate)

挺有意思的方法,传入一个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式的变成,对单一个值的处理会相当的棒,这就是它的应用场景。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值