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