java 8 Optional的使用

一、Optional源碼

package java.util;

import ......

public final class Optional < T > {

    private static final Optional << ? > EMPTY = new Optional < > ();
    private final T value;
    private Optional() {
        this.value = null;
    }
    public static < T > Optional < T > empty() {
        @SuppressWarnings("unchecked")
        Optional < T > t = (Optional < T > ) EMPTY;
        return t;
    }
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    public static < T > Optional < T > of (T value) {
        return new Optional < > (value);
    }
    public static < T > Optional < T > ofNullable(T value) {
        return value == null ? empty() : of (value);
    }
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
    public boolean isPresent() {
        return value != null;
    }
    public void ifPresent(Consumer << ? super T > consumer) {
        if (value != null)
            consumer.accept(value);
    }
    public Optional < T > filter(Predicate << ? super T > predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }
    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));
        }
    }
    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));
        }
    }
    public T orElse(T other) {
        return value != null ? value : other;
    }

    public T orElseGet(Supplier << ? extends T > other) {
        return value != null ? value : other.get();
    }
    public < X extends Throwable > T orElseThrow(Supplier << ? extends X > exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (!(obj instanceof Optional)) {
            return false;
        }

        Optional << ? > other = (Optional << ? > ) obj;
        return Objects.equals(value, other.value);
    }
    @Override
    public int hashCode() {
        return Objects.hashCode(value);
    }
    @Override
    public String toString() {
        return value != null ?
            String.format("Optional[%s]", value) :
            "Optional.empty";
    }
}

二、建立Optional對象

//聲明一個空的Optional
Optional<Car> optCar = Optional.empty();
/**
*依據一個非空值建立Optional.
*若是car是一個null,這段代碼會當即拋出一個NullPointerException,而不是等到你 試圖訪問car的屬性值時才返回一個錯誤
*/
Optional<Car> optCar = Optional.of(car)
//可接受null的Optional
 Optional<Car> optCar = Optional.ofNullable(car);

三、Optional類的方法列舉和簡單描述

方法java

描述app

emptyide

返回一個空的 Optional 實例函數

filterui

若是值存在而且知足提供的謂詞,就返回包含該值的 Optional 對象;不然返回一個空的 Optional 對象this

flatMapspa

若是值存在,就對該值執行提供的 mapping 函數調用,返回一個 Optional 類型的值,不然就返回一個空的 Optional 對象code

get

若是該值存在,將該值用 Optional 封裝返回,不然拋出一個 NoSuchElementException 異常orm

ifPresent

若是值存在,就執行使用該值的方法調用,不然什麼也不作對象

isPresent

若是值存在就返回 true,不然返回 false

map

若是值存在,就對該值執行提供的 mapping 函數調用

of

將指定值用 Optional 封裝以後返回,若是該值爲 null,則拋出一個 NullPointerException 異常

ofNullable

將指定值用 Optional 封裝以後返回,若是該值爲 null,則返回一個空的 Optional 對象

orElse

若是有值則將其返回,不然返回一個默認值

orElseGet

若是有值則將其返回,不然返回一個由指定的 Supplier 接口生成的值

orElseThrow

若是有值則將其返回,不然拋出一個由指定的 Supplier 接口生成的異常

四、Optional類的方法舉例

1.ifPresent

Optional<User> user = Optional.ofNullable(getUserById(id));
user.ifPresent(u -> System.out.println("Username is: " + u.getUsername()));

2.orElse

若是 Optional 中有值則將其返回,不然返回 orElse 方法傳入的參數。

User user = Optional
        .ofNullable(getUserById(id))
        .orElse(new User(0, "Unknown"));
        
System.out.println("Username is: " + user.getUsername());

3.orElseGet

orElseGet 與 orElse 方法的區別在於,orElseGet 方法傳入的參數爲一個 Supplier 接口的實現 —— 當 Optional 中有值的時候,返回值;當 Optional 中沒有值的時候,返回從該 Supplier 得到的值。

User user = Optional
        .ofNullable(getUserById(id))
        .orElseGet(() -> new User(0, "Unknown"));
        
System.out.println("Username is: " + user.getUsername());

4.orElseThrow

orElseThrow 與 orElse 方法的區別在於,orElseThrow 方法當 Optional 中有值的時候,返回值;沒有值的時候會拋出異常,拋出的異常由傳入的 exceptionSupplier 提供。

User user = Optional
        .ofNullable(getUserById(id))
        .orElseThrow(() -> new EntityNotFoundException("id 爲 " + id + " 的用戶沒有找到"));
相關文章
相關標籤/搜索