Optional的理解和使用


1、Optional 到底是什么?

Optional 是一個包裝類。類中包裝的對象可以為 NULL 或非 NULL。簡單說就是把 NULL 包了一層,防止直接對 NULL 操作報NPE。

2、Optional 的方法說明:

定義:

  • Optional 空實例:Optional 實例中的 value == null。
  • 判斷 Optional 是否存在:Optional 實例中的 value 是否為 null。

看一下Optional 中的源碼,大概可以分為如下幾類:

2.1 構造函數:2個

private Optional():構建一個空的 Optional 實例。實例中的 value == null

private Optional(T var1):構建一個Optional 實例。實例中的 value == var1。var1為NULL會拋NPE.

2.2 獲取 Optional 實例方法

public static <T> Optional<T> empty():獲取一個 Optional 空實例。

public static <T> Optional<T> of(T var0):獲取一個 Optional 實例。var0為NULL會拋NPE。

public static <T> Optional<T> ofNullable(T var0):獲取一個 Optional 實例。var0為 NULL 會返回一個 Optional 空實例。

2.2 獲取 Optional 實例中的 value:

public T get():value 為空拋NoSuchElementException。

public T orElse(T var1):value 不為 NULL 則返回 value ;為 NULL 返回 var1。

public T orElseGet(Supplier<? extends T> var1):value 不為 NULL 則返回 value ;為 NULL 執行 var1。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> var1) throws X:value 不為 NULL 則返回 value ;為 NULL 執行 var1。

2.3 判斷 Optional 是否存在

public boolean isPresent():即返回 Optional 實例中的 value 是否為 NULL。

public void ifPresent(Consumer<? super T> var1): value 不為 NULL 則執行 var1。

2.4 判斷是否相等

public boolean equals(Object var1):感覺不出來和其他 equals 有什么區別。唯一的區別就是如果 optional 實例中的 value 為 NULL 也不會有異常,而是會正常進行比較。

2.5 其他 Lambda 表達式的操作:

下面三個方法,如果當前對象為NULL,則返回自己或者一個 Optional 空實例。不 NULL 則執行后面的 Lambda,得到返回結果的Optional 實例。大概是這樣,詳細區別見源碼吧。

public Optional<T> filter(Predicate<? super T> var1)

public <U> Optional<U> map(Function<? super T, ? extends U> var1)

public <U> Optional<U> flatMap(Function<? super T, Optional<U>> var1)

3、Optional 的使用:

暫時沒有實例。后續用到了再補。

可先參考:Java高級(三):Optional的巧用 - 知乎

4、參考:

  1. Java 8 中文版 - 在線 API 中文手冊 - 碼工具
  2. 使用 Java8 Optional 的正確姿勢 | 隔葉黃鶯 Yanbin Blog - 軟件編程實踐
    注:先參考一下。后續再完善。
  3. Java高級(三):Optional的巧用 - 知乎
  4. 深入理解 java8 中的 Optional 類 - 至寶屠夫的博客 - CSDN 博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM