JDK8 Optional类

事情起因,看同事代码,突然发现if的条件和以往好像不太一样,加上阿里的java开发规范中建议JDK8的用Optional类来解决空指针异常,这似乎大家都会???于是,优秀的我必须要学习一下
在这里插入图片描述
请先看同事源代码

if (Optional.ofNullable(dto.getStatus()).isPresent()) {
            wrapper.eq(Live::getStatus, dto.getStatus());
        }

可以看出来,if的条件(即括号中的内容)
dto.getStatus() 是一个实体的状态值;乍一看很懵,这个条件结果为什么是true/false
于是参考了菜鸟教程解释:

原来Optional类是JDK8的新内容,主要有几个方法:(我觉得能够常用的)

首先两个方法
Optional.ofNullable 和Optional.of
这两个方法的明显区别就是Optional.of 的传参不可以是null,如果是null,会报NPE异常,即空指针异常;而Optional.ofNullable 的参数可以是null

代码:

Integer value1 = null;
        Integer value2 = 10;

        Optional<Integer> a = Optional.ofNullable(value1);
        Optional<Integer> c = Optional.ofNullable(value2);
        Optional<Integer> d = Optional.of(value2);


        System.out.println("第一个参数值存在: " + a.isPresent());
        System.out.println("第三个参数值存在: " + c.isPresent());
        System.out.println("第四个参数值存在: " + d.isPresent());

这里又涉及到一个方法
Optional.isPresent 判断是否存在
如果值不为null的话结果就是true,如果值是null的话结果就是false

所以这段代码运行后结果为:

第一个参数值存在: false
第三个参数值存在: true
第四个参数值存在: true

这时候我们回到最初,看同事源代码就可以看得很清楚了:

if (Optional.ofNullable(dto.getStatus()).isPresent()) {
            wrapper.eq(Live::getStatus, dto.getStatus());
        }

将dto这个对象的状态放入到Optional中,然后通过isPresent方法判断状态是否为null,如果不是null则结果为true,则可以进入if判断语句中

延伸:

1、

   Optional<Integer> b = Optional.of(value1);
   System.out.println("第二个参数值存在: " + b.isPresent());

运行这段代码,会直接报NPE(空指针)异常

2、
Optional.orElse 如果值存在,返回它,否则返回默认值
代码:

Integer value = 5;
Optional<Integer> a = Optional.ofNullable(value);
// Optional.orElse - 如果值存在,返回它,否则返回默认值
value = a.orElse(value);
System.out.println("检验值是否存在,存在则返回:" + value);

返回结果是:

检验值是否存在,存在则返回:5

则可以看出来
如果
值--------Optional中,用of方法或ofNullable方法
Optional-----------值,用orElse方法(可以返回null)

3、
Optional.get 获取值,值需要存在
这个方法和orElse有异曲同工之处,但是这个需要放入Optional的对象不能是null
代码:

//Optional.get - 获取值,值需要存在
Integer aaa = a.get();
System.out.println("获取aaa的值" + aaa);

运行结果为:

获取aaa的值5

如果将value的值改为null,则这个get方法将会报NoSuchElementException异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值