在開發過程當中,咱們常常遇到NullPointerException,爲了不NullPointerException這個異常,咱們常常要在代碼裏判斷非空,致使代碼膨脹,影響了可讀性。爲此Java 8中引入了一個新的類java.util.Optional<T>,這是一個封裝Optional值的類,來處理有可能爲空的狀況。
Optional有兩個成員對象,一個是EMPTY,一個是value。EMPTY是Optional類型的,value是T泛型。java
建立一個空的Optional。
從源碼能夠看中,這個value是爲null。app
public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } private static final Optional<?> EMPTY = new Optional<>(); private Optional() { this.value = null; }
經過指定的值建立Optional,從源碼能夠看出,有判斷非空,因此這個方法若是傳遞過來的是null,會拋NullPointerException異常。ui
public static <T> Optional<T> of(T value) { return new Optional<>(value); } private Optional(T value) { this.value = Objects.requireNonNull(value); }
若是容許接受一個爲空的Optional,就能夠用ofNullable。從源碼能夠看出,若是是爲空,就調用empty方法,若是不爲空,調用of方法。this
public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
判斷value是否爲空,不爲空返回true,爲空返回falsecode
public boolean isPresent() { return value != null; }
把指定對象映射後返回Optional。
從源碼能夠看出,先判斷mapper是否爲空,爲空拋出異常。不爲空,再判斷value是否爲空,爲空,直接返回empty,不爲空,經過Function的返回值建立一個Optional。對象
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } }
相似map,不一樣的是返回的是Optional類型,多層封裝對象的時候能夠用這個方法,好比有個Person類,Person有個child成員變量,也是Person對象,能夠這樣獲取person的name,optPerson.flatMap(Person::getOptChild).map(Person::getName)
。開發
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } }
返回Optional的value,若是value爲空,拋出NoSuchElementException異常。get
public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; }
若是value不爲空,返回value,不然返回默認值源碼
public T orElse(T other) { return value != null ? value : other; }
這個跟orElse相似,只是爲空的時候,返回的是Supplier的get方法。io
public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); }
若是value爲空,則拋異常,這個異常是有傳過來的Supplier的get指定的。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } }
若是value存在,則調用Consumer的accept方法。
public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); }
若是存在且知足Predicate的test方法,返回當前的Optional,不然返回空的Optional對象
public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); }