java8 - Optional

在開發過程當中,咱們常常遇到NullPointerException,爲了不NullPointerException這個異常,咱們常常要在代碼裏判斷非空,致使代碼膨脹,影響了可讀性。爲此Java 8中引入了一個新的類java.util.Optional<T>,這是一個封裝Optional值的類,來處理有可能爲空的狀況。
Optional有兩個成員對象,一個是EMPTY,一個是value。EMPTY是Optional類型的,value是T泛型。java

empty

建立一個空的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;
}

of

經過指定的值建立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);
}

ofNullable

若是容許接受一個爲空的Optional,就能夠用ofNullable。從源碼能夠看出,若是是爲空,就調用empty方法,若是不爲空,調用of方法。this

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

isPresent

判斷value是否爲空,不爲空返回true,爲空返回falsecode

public boolean isPresent() {
    return value != null;
}

map

把指定對象映射後返回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));
    }
}

flatMap

相似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));
    }
}

get

返回Optional的value,若是value爲空,拋出NoSuchElementException異常。get

public T get() {
    if (value == null) {
        throw new NoSuchElementException("No value present");
    }
    return value;
}

orElse

若是value不爲空,返回value,不然返回默認值源碼

public T orElse(T other) {
    return value != null ? value : other;
}

orElseGet

這個跟orElse相似,只是爲空的時候,返回的是Supplier的get方法。io

public T orElseGet(Supplier<? extends T> other) {
    return value != null ? value : other.get();
}

orElseThrow

若是value爲空,則拋異常,這個異常是有傳過來的Supplier的get指定的。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}

ifPresent

若是value存在,則調用Consumer的accept方法。

public void ifPresent(Consumer<? super T> consumer) {
    if (value != null)
        consumer.accept(value);
}

filter

若是存在且知足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();
}
相關文章
相關標籤/搜索