Optional

198 阅读1分钟

引言

Optional是Java8新引入的一个类,主要用于解决空指针异常问题。

创建Optional实例

//当of() 方法参数为null时,会抛出 NullPointerException
Optional<String> emptyOpt = Optional.of(null);
​
private Optional(T value) {
     this.value = Objects.requireNonNull(value);
}
​
public static <T> T requireNonNull(T obj) {
     if (obj == null)
         throw new NullPointerException();
     return obj;
}

使用Optional.ofNullable()创建Optional实例

 Optional<String> emptyOpt = Optional.ofNullable(null);
​
public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
 
   public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
  private static final Optional<?> EMPTY = new Optional<>();

访问Optional对象的值

 Optional<String> emptyOpt = Optional.ofNullable(null);
//  当值为null是,会抛出异常
       emptyOpt.get();
​
  public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
​

判断是否有值

Optional<String> emptyOpt = Optional.ofNullable(null);
emptyOpt.isPresent();
​
public boolean isPresent() {
        return value != null;
 }
​
//如果不为空,则执行Lambda表达式
 public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
 }

当对象为空时,返回默认值

//当传入的值为空时,返回 orElse()方法参数
Object other = Optional.ofNullable(null).orElse("other");
// 如果orElse 传入的参数是一个函数,函数都会在每次调用这个方法时都会执行
public T orElse(T other) {
      return value != null ? value : other;
 }

当返回的默认值为一个函数时,采用orElseGet()更有可能提高性能,避免不必要的函数被执行

Object othe1r = Optional.ofNullable("hhh").orElseGet(() -> anInt());
​
public T orElseGet(Supplier<? extends T> other) {
    return value != null ? value : other.get();
}

转换值(map)

Object other = Optional.ofNullable("hhh").map(String::toUpperCase);  //Optional[HHH]
​
  /**
     * 
     * @param mapper
     * @return Optional<T> 对象
     */
 public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
     //判断mapper 是否为空 ,如果为空,则抛出 NullPointerException
        Objects.requireNonNull(mapper);
     //判断 value 值是否为 null 
        if (!isPresent())
            return empty();
        else {
            //创建一个新的Optional对象
            return Optional.ofNullable(mapper.apply(value));
        }
    }

过滤值filter()

 Object other = Optional.ofNullable("hhh").filter(String::isEmpty);
 
​
/**
     * 
     * @param mapper
     * @return  如果不满足过滤条件,则返回一个空的Optional 对象
     */
public Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }

\