说明:
Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。
本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。
重要的一点是 Optional 不是 Serializable。因此,它不应该用作类的字段。
空指针异常
在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException:
String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
如果要确保不触发空指针异常,就得在访问每一个值之前对其进行明确地检查:
if (user != null) {
Address address = user.getAddress();
if (address != null) {
Country country = address.getCountry();
if (country != null) {
String isocode = country.getIsocode();
if (isocode != null) {
isocode = isocode.toUpperCase();
}
}
}
}
Optional类的三种创建方法:
1、public static<T> Optional<T> empty():返回一个空的Optional实例。
问题1:返回的对象使用get()方法时会报java.util.NoSuchElementException异常,因为是一个空对象。
2、public static <T> Optional<T> of(T value):返回非空的Optional,通过参数value传入值。
问题1:当对象为null时会抛出空指针异常,所以当对象不为null时可使用of()创建方法。
3、public static <T> Optional<T> ofNullable(T value):如果对象即可能是 null 也可能是非 null,你就应该使用 ofNullable() 方法。其本质是value为null时调用empty()方法,当value不为null时则调用of(null)方法。
PS:当使用==对Optional的对象进行比较时,是进行值的比较,当值相同时则相等(当值时对象时,则是比较对象的地址)。
常用方法:
1、public T get():从 Optional 实例中取回实际值对象的方法之一。
2、public boolean isPresent():判断Optional对象的value是不是null,如果不为null,则可执行get()方法。
3、public void ifPresent(Consumer<? super T> consumer):如果存在值,则使用该值调用指定的使用者,否则,什么都不做。例如:
optional1.ifPresent(s -> System.out.println(s.length()));
4、public T orElse(T other) :如果存在就返回值,如果不存在则返回其他(other)。
5、public T orElseGet(Supplier<? extends T> other):返回值(如果存在);否则,调用other并返回该调用的结果。如:
String name = Optional.ofNullable(nullName).orElseGet(() -> "john");