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异常
上一篇: vue+elementui实现表格行合并
下一篇: elementui的使用