简介
Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供了很多有用的方法。这样我们就不用显示进行空值检测。
Optional类的引入了很好的解决空指针异常。
Optional 容器类的常用方法
- Optional.of(T t):创建一个Optional实例
User user1 =new User("赵六",20,10000);
Optional<User> user11 = Optional.of(user1);
System.out.println(user11.get());
-----------------------输出-------------------
User{name='赵六', age=20, salary=10000.0}
------------------------------------------------
//注意Optional.of()不能创建空实例
Optional<Object> o = Optional.of(null);
System.out.println(o.get());
---------------------输出-------------------
java.lang.NullPointerException
//说明这个方法只能创建不为空的Optional实例
- Optional.empty():创建一个空的Optional实例
Optional<Object> empty = Optional.empty();
System.out.println(empty.get());
------------------------输出-----------------
java.util.NoSuchElementException: No value present
//不会报空指针异常了吗,直接说明在那个地方遇到了没有值
- Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例
Optional<User> user = Optional.ofNullable(new User("赵六",20,10000));
System.out.println(user.get());
-----------------------输出-------------------
User{name='赵六', age=20, salary=10000.0}
------------------------------------------------
Optional<Object> o = Optional.ofNullable(null);
System.out.println(o.get());
-----------------------输出-------------------
java.util.NoSuchElementException: No value present
//不会报空指针异常了吗,直接说明在那个地方遇到了没有值
- isPresent():判断是否存在值
Optional<User> user = Optional.of(new User("赵六", 20, 10000));
System.out.println(user.isPresent());
-----------------------输出-------------------
true
- orElse(T t):如果调用对象包含值,则返回该值,否则返回T
Optional<User> user = Optional.ofNullable(null);
System.out.println(user.orElse(new User("赵六",20,10000)));
-----------------------输出-------------------
User{name='赵六', age=20, salary=10000.0}
- orElseGet(Supplier s):如果该值存在,返回该值,否则返回s获取的值
Optional<User> user = Optional.ofNullable(null);
System.out.println(user.orElseGet(()->new User("赵六",20,10000)));
-----------------------输出-------------------
User{name='赵六', age=20, salary=10000.0}
- orElseThrow(Supplier s):如果存在该值,返回包含的值,否则抛出由Supplier继承的异常
Optional<User> user = Optional.ofNullable(null);
user.orElseThrow(()->new IllegalArgumentException("nihao"));
-----------------------输出-------------------
java.lang.IllegalArgumentException: nihao
补充
在java9里为Optional类添加了三个方法:or()、ifPresentOrElse()和stream()
- or(Supplier s):如果存在该值,就返回该值,否则返回由Supplier参数产生的另一个Optional对象
Optional<User> user = Optional.ofNullable(null);
Optional<User> or = user.or(() -> Optional.of(new User("赵六",20,10000)));
System.out.println(or.get());
-----------------------输出-------------------
User{name='赵六', age=20, salary=10000.0}
- ifPresentOrElse(Consumer c,Runnable r):如果存在该值,就执行Consumer,否则就执行Runnable
Optional<User> user = Optional.ofNullable(null);
user.ifPresentOrElse(System.out::println, ()-> System.out.println("不存在值"));
-----------------------输出-------------------
不存在值
- stream():就是把Optional实例转换为Stream对象,如果没有值,它会得到一个空的Stream
在java10里为Optional类添加了orElseThrow()
orElseThrow():就是主动抛出异常
Optional<User> user = Optional.ofNullable(null);
user.orElseThrow();
-----------------------输出-------------------
java.util.NoSuchElementException: No value present
在java11里为Optional类添加了isEmpty()
isEmpty(),判断是否为空
Optional<User> user = Optional.ofNullable(null);
System.out.println(user.isEmpty());
-----------------------输出-------------------
true
总结
Optional 主要用作返回类型。在获取到这个类型的实例后,如果它有值,你可以取得这个值,否则可以进行一些替代行为。
Optional 类有一个非常有用的用例,就是将其与流或其它返回 Optional 的方法结合,以构建流畅的API。
补充
Optional同样有filter,map,flatMap这些方法
不过它们返回的都是Optional对象
map可以返回Optional.empty()