JDK1.8 optional使用

使用场景

我们从一个简单的用例开始。在 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提供的常用方法
在这里插入图片描述
你以为这样就敷衍了事?no,no,no,俺是贴心软宝宝。

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对象为空的话,便直接返回“nul”。否则的话进行正常的调用,如果过程中有任何一个对象为空的话,也直接返回“null”。

发布了5 篇原创文章 · 获赞 5 · 访问量 144

猜你喜欢

转载自blog.csdn.net/weixin_44615512/article/details/105041473