背景介绍
Java 8 引入了一个十分实用的 Optional 类,它主要是为了解决空指针异常(NullPointerException)。当我们对对象的属性进行检查,判断它的值是否为期望的格式,最终却发现我们查看的并不是一个对象,而是一个空指针,它会立即抛出一个让人厌烦的 NullPointerException 异常。
本质上,Optional 类是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
案例
从一个简单的用例开始。在 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 优化这些代码。
基本用法解析
Optional 的对象可能包含值,也可能为空。可以使用同名方法创建一个空的 Optional。
Optional<User> emptyOpt = Optional.empty();
emptyOpt.get();
复制代码
此时访问 emptyOpt 变量的值会导致 NoSuchElementException。
还可以使用 of() 和 ofNullable() 方法创建包含值的 Optioanal 实例,区别在于如果将 null 当作参数传进去 of() 会报空指针异常,所以当对象可能存在或者不存在,应该使用 ofNullable()。
Optional<User> opt = Optional.of(user);
Optional<User> opt = Optional.ofNullable(user);
复制代码
从 Optional 实例中获得实际值对象的方法之一是使用 get() 方法。
String name = "John