使用场景
我们从一个简单的用例开始。在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException。
//人
public class Person {
private Car car;
public Car getCar() {
return car;
}
}
//车
public class Car {
private Insurance insurance;
public Insurance getInsurance() {
return insurance;
}
}
//保险
public class Insurance {
private String name;
public String getName() {
return name;
}
}
现在需要获取到一个person对象,然后获取此人的车的保险名称,1.8前可以这样写
if(person!=null){
Car car = person.getCar();
if(car!=null){
Insurance insurance = car.getInsurance();
if(insurance.getName()!=null){
return insurance.getName();
}
}
}
这样写也没有错,但是影响美观,冗余,便有了java8提供的optional来改善这一问题。
常见方法
看下optional提供的常用方法
public final class Optional<T> {
//Null指针的封装
private static final java.util.Optional<?> EMPTY = new java.util.Optional<>();
//内部包含的值对象
private final T value;
private Optional() ;
//返回EMPTY对象
public static<T> java.util.Optional<T> empty() ;
//构造函数,但是value为null,会报NPE
private Optional(T value);
//静态工厂方法,但是value为null,会报NPE
public static <T> java.util.Optional<T> of(T value);
//静态工厂方法,value可以为null
public static <T> java.util.Optional<T> ofNullable(T value) ;
//获取value,但是value为null,会报NoSuchElementException
public T get() ;
//返回value是否为null
public boolean isPresent();
//如果value不为null,则执行consumer式的函数,为null不做事
public void ifPresent(Consumer<? super T> consumer) ;
//过滤,如果value不为null,则根据条件过滤,为null不做事
public java.util.Optional<T> filter(Predicate<? super T> predicate) ;
//转换,在其外面封装Optional,如果value不为null,则map转换,为null不做事
public<U> java.util.Optional<U> map(Function<? super T, ? extends U> mapper);
//转换,如果value不为null,则map转换,为null不做事
public<U> java.util.Optional<U> flatMap(Function<? super T, java.util.Optional<U>> mapper) ;
//value为null时,默认提供other值
public T orElse(T other);
//value为null时,默认提供other值
public T orElseGet(Supplier<? extends T> other);
//value为null时,默认提供other值
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) ;
}
根据optional提供方法进行改造
public static void test(Person person){
Optional.ofNullable(person)
.map(Person::getCar)
.map(Car::getInsurance)
.map(Insurance::getName)
.orElse("null");
}
这里将person包装成为一个Optional对象,使用ofNullable方法,如果传入的person对象为空的话,便直接返回“null”。否则的话进行正常的调用,如果过程中有任何一个对象为空的话,也直接返回“null”。