Optional
java8中引入一个新的类java.util.Optional。这是一个包装引用类型的一个类。java8之前调用方法的时候当我们不知道返回值是否可能为null的时候,我们要对每个结果使用前进行null检查,如果不慎对null引用进行调用就会抛出NullPointerException异常。现在我们可以通过Optional.empty()返回一个空的Optional对象,它返回一个特定的单一实例。这样对Optional.empty()的操作也防止NullPointerException异常产生。
使用Optional一个重要原因就是,例如当我们声明一个Optional类型的时候表示这个Car变量是可以缺失的。当我们声明一个Car的时候表示这个Car是不能缺失的。这样就对数据的可能行清晰的理解,丰富的数据模型的语义。
Optional对象创建
1.声明一个空的Optional
Optional optCar = Optional.empty();
2依据一个非空值创建Optional
Optional optCar = Optional.of(car);
如果car是一个null会立即抛出一个NullPointerException,而不是等你试图访问car的属性是才返回一个错误。
3可接受null的Optional
Optional optCar = Optional.ofNullable(car);
Optional对象获取
使用map从Optional对象中提取和转换值。
使用flatMap链接Optional对象
例:
public class OptionalTest {
public static void main(String[] args) {
Optional p = getP();
Optional panme = p.map(pe -> pe.getName());
Optional carname = p.flatMap(pp -> pp.getCar()).flatMap(car -> car.getName());
}
public static Optional getP() {
return Optional.ofNullable(null);
}
}
class Persion {
private Optional car;
private String name;
public Optional getCar() {
return car;
}
public void setCar(Optional car) {
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Car {
private Optional name;
public Optional getName() {
return name;
}
public void setName(Optional name) {
this.name = name;
}
}
读取Optional中实例变量的值
Optional类提供了多种方法
get()是方法中简单但又是最不安全的方法。如果变量存在则返回封装的变量值,否则抛出NoSuchElementException。
OrElse(T other)允许在Optional对象在不含值的时候提供一个默认值。
isPresent()可以判定Optional封装的变量是否存在。