目录
我们要养成看官方文档的好习惯,所以先来看看JDK 8官方文档上的解释:
这句话大概的意思,就是说Optional是一个基于值的类,在它里面会存放一个为NULL或不为NULL的值,也就是value,然后这个类里面的API都是围绕着这个值而被开发的。
先来看看源码
public final class Optional<T> {
...
private Optional() {
this.value = null;
}
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
...
}
这是Optional类的两个构造函数,可以看出要使用Optional实例,这个value值是必须存在的,要么为NULL,要么就是一个被给定的值。
我们看看官方文档上对API功能的解释,可以看出来都是围绕着这个value值是否存在而开发的。
列举几个API的功能
get():如果这个Optional类实例的value值不为NULL,则返回这个value,否则抛异常;
filter(Predicate<? super T> predicate):如果这个Optional类实例的value值不为NULL,并且可以匹配所给的predicate条件,那么就返回这个类实例的value,否则返回value值为NULL的Optional类实例;
ifPresent(Consumer<? super T> consumer):如果这个Optional类实例的value值不为NULL,则携带这个value执行consumer语法,否则什么也不做;
isPresent():判断这个Optional类实例的value值是否存在,是的话返回true,否的话返回false;
orElse(T other):如果这个Optional类实例的value值存在,则返回这个值,否则返回other。
用传统的非空判断来作个对比
public static void main(String[] args) {
try {
Student student = new Student();
// 用来存放学生的名字
String stuName;
// 1.传统判断NULL的方法
if (student.getName() == null) {
throw new NullPointerException();
} else {
stuName = student.getName();
}
// 2.使用Optional判断NULL
Optional.of(student.getName());
stuName = student.getName();
// 输出学生的名字
System.out.println(stuName);
} catch (Exception e) {
System.out.println(e);
}
}
Optional类2行代码可以实现的功能,传统方法需要用5行代码,相对来说就可以省略掉一些比较多余的步骤,同时也会让自己的代码看起来更简洁优雅一点啦。
应用场景
一句话简洁带过,当你需要对某一个数据进行非空判断的时候,就可以考虑采用Optional类,毕竟里面有很多已经被封装好的方法,比如非空的判断,直接调用就可以了,是不是就可以省略掉很多自己写的操作啦。