Optional 类主要解决的问题是臭名昭著的空指针异常NPE(NullPointerException)
在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException:
java
String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
在这个小示例中,如果我们需要确保不触发异常,就得在访问每一个值之前对其进行明确地检查:
java
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可以精简代码,降低复杂度:
java
String result = Optional.ofNullable(user)
.flatMap(User::getAddress)
.flatMap(Address::getCountry)
.map(Country::getIsocode)
.orElse("default");
Optional 创建
创建 Optional 对象主要三种:
● Optional.of(T t):创建一个 Optional 对象,参数 t 必须非空;
● Optional.empty():创建一个空的Optional实例;
● Optional.ofNullable(T t):创建一个Optional对象,参数t 可以为 null。
- empty(): 尝试访问 emptyOpt 变量的值会导致 NoSuchElementException。
java
Optional<User> emptyOpt = Optional.empty();
emptyOpt.get();
- of(): 如果user为空,会抛出NullPointerException。
java
Optional<User> opt = Optional.of(user);
- ofNullable(): 如果对象即可能是 null 也可能是非 null,你就应该使用 ofNullable() 方法。
java
Optional<User> opt = Optional.ofNullable(user);