欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK8 Optional类

程序员文章站 2022-03-04 11:34:23
...

事情起因,看同事代码,突然发现if的条件和以往好像不太一样,加上阿里的java开发规范中建议JDK8的用Optional类来解决空指针异常,这似乎大家都会???于是,优秀的我必须要学习一下
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异常

相关标签: JDK8 java java