首頁 > 軟體

Java中Optional類及orElse方法詳解

2022-08-25 22:01:35

引言

為了讓我更快的熟悉程式碼,前段時間組長交代了一個小任務,大致就是讓我整理一下某個模組中涉及的 sql,也是方便我有目的的看程式碼,也是以後方便他們查問題(因為這個模組,涉及的判斷很多,所以之前如果 sql 出錯了,查問題比較繁瑣)。

昨天算是基本完成了,然後今天組長就讓給我看一個該模組的缺陷,由於剛對該模組進行過整理,所以還算清晰......看程式碼過程中,看到一些地方進行判空時都用到了 orElse() 方法,之前沒怎麼用過,熟悉一下......

Java 中的 Optional 類

Optional 類是 Java8 為了解決 NULL 值判斷等問題提出的。使用 Optional 類可以避免顯式的判斷 NULL 值(NULL 的防禦性檢查),避免某一處因為出現 NULL 而導致的 NPE(NullPointerException)。

ofNullable() 方法

/**
 * A container object which may or may not contain a non-null value.
 * If a value is present, {@code isPresent()} will return {@code true} and
 * {@code get()} will return the value.
 */
 public final class Optional<T> {

    /**
     * Common instance for {@code empty()}.
     */
    private static final Optional<?> EMPTY = new Optional<>(); //執行Optional的無參構造
    
	//無參構造
	private Optional() {
        this.value = null;
    }
    //有參構造
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    /**
     * Returns an {@code Optional} describing the specified value, if non-null,
     * otherwise returns an empty {@code Optional}.
     * 如果value不是null, 返回它自己本身, 是空, 則執行empty(), 返回null
     *
     * @param <T> the class of the value
     * @param value the possibly-null value to describe
     * @return an {@code Optional} with a present value if the specified value
     * is non-null, otherwise an empty {@code Optional}
     */
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
    /**
     * Returns an empty {@code Optional} instance.  No value is present for this
     * Optional.
     * 當value是空時, 返回Optional<T>物件
     *
     * @apiNote Though it may be tempting to do so, avoid testing if an object
     * is empty by comparing with {@code ==} against instances returned by
     * {@code Option.empty()}. There is no guarantee that it is a singleton.
     * Instead, use {@link #isPresent()}.
     *
     * @param <T> Type of the non-existent value
     * @return an empty {@code Optional}
     */
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;  //由第一行程式碼可知, EMPTY是一個無參Optional物件
        return t;
    }
   
    /**
     * Returns an {@code Optional} with the specified present non-null value.
     * 返回不等於null的value值本身
     *
     * @param <T> the class of the value
     * @param value the value to be present, which must be non-null
     * @return an {@code Optional} with the value present
     * @throws NullPointerException if value is null
     */ 
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);  //執行Optional的有參構造
    }
 }

從原始碼中可以看出來,ofNullable() 方法做了 NULL 值判斷,所以我們可以直接呼叫該方法進行 NULL 值判斷,而不用自己手寫 NULL 值判斷。

orElse() 方法

    /**
     * Return the value if present, otherwise return {@code other}.
     * 如果值存在(即不等於空), 返回值本身, 如果等於空, 就返回orElse()方法的引數other.
     *
     * @param other the value to be returned if there is no value present, may
     * be null
     * @return the value, if present, otherwise {@code other}
     */
    public T orElse(T other) {
        return value != null ? value : other;
    }

從原始碼中可以看出,呼叫 orElse() 方法時,當值為 NULL 值,返回的是該方法的引數;當值不為 NULL 時,返回值本身。

案例

Optional.ofNullable(scRespDTO.getMsgBody().getSuccess()).orElse(false);

上述案例中,如果 ofNullable() 方法執行結果不為 NULL,則返回 scRespDTO.getMsgBody().getSuccess() 的值;

如果 ofNullable() 方法的執行結果是 NULL,則返回 false,即,orElse() 方法的引數。

orElseGet() 方法

    /**
     * Return the value if present, otherwise invoke {@code other} and return
     * the result of that invocation.
     * 值如果存在(即不為空), 返回值本身, 如果不存在, 則返回實現了Supplier介面的物件. 
     * Supplier介面就只有一個get()方法. 無入參,出參要和Optional的物件同型別.
     *
     * @param other a {@code Supplier} whose result is returned if no value
     * is present
     * @return the value if present otherwise the result of {@code other.get()}
     * @throws NullPointerException if value is not present and {@code other} is
     * null
     */
    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

從原始碼中可以看出來,呼叫 orElseGet() 方法時,如果值為 NULL,返回的是實現了 Supplier 介面的物件的 get() 值;

如果值不為 NULL,則返回值本身。

案例

System.out.println(Optional.ofNullable("努力成為一名更優秀的程式媛").orElseGet(()->"你不夠優秀"));
System.out.println(Optional.ofNullable(null).orElseGet(()->"你沒有努力"));  

orElseGet() 可以傳入一個supplier介面,裡面可以花樣實現邏輯。

上述案例中,第一句,ofNullable() 不為 NULL,就輸出"努力成為一名更優秀的程式媛",反之,則輸出"你不夠優秀";

第二句,ofNullable() 為 NULL, 輸出 "你沒有努力"。

orElse() 與 orElseGet() 之間的區別

注意

orElse() 與 orElseGet() 兩者之間是 有區別 的。雖然當值為 NULL 時,orElse() 與 orElseGet() 都是返回方法的引數,但區別就是:orElse() 方法返回的是引數本身,而 orElseGet() 方法並不是直接返回引數本身,而是返回 引數的 get() 值,且 該引數物件必須實現 Supplier 介面(該介面為函數式介面)。這就使得 orElseGet() 方法更加靈活。

簡單做了一下 Java 中 Optional 類以及其中的 orElse() 方法 與 orElseGet() 方法相關的內容,以前沒有了解過。文中顯然引入了許多原始碼,也是為了方便理解不是? :)

以上就是Java中Optional類及orElse()方法詳解的詳細內容,更多關於Java Optional類 orElse()方法的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com