天天看點

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

Java 8中所謂的Optional對象,即一個容器對象,該對象可以包含一個null或非null值。如果該值不為null,則調用isPresent()方法将傳回true,且調用get()方法會傳回該值。

另外,該對象還有其它方法:

如可以使用orElse()方法給Optional對象設定預設值(當值為null時,會使用預設值);

使用ifPresent()方法來執行一段代碼(當值不為null時,執行代碼段)。

Optional主要被用于Java 8的Stream中,簡單舉個例子:

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

減少NullPointerException異常

寫出更加優雅的代碼

Optional類的屬性和方法如下:

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

我們一個個看,先看兩個成員屬性;

成員屬性

如下,一個是EMPTY常量,即存放空值的Optional對象,另一個是value,即被存放的值,可為null或非null值;

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

構造方法

兩個構造方法,注意都是私有的

1、建立一個包含空值的Optional對象;

2、建立一個非空值的Optional對象;

這個方法很簡單,作用是傳回一個Optional執行個體,裡面存放的value是null,源碼如下:

of(T value)方法

很簡單,就是傳回一個包含非空值的Optional對象

ofNullable(T value)方法

 很簡單,傳回一個可以包含空值的Optional對象

get()方法

 得到Optional對象裡的值,如果值為null,則抛出NoSuchElementException異常

isPresent()方法

很簡單,判斷值是否不為null

ifPresent(Consumer<? super T> consumer)方法

 當值不為null時,執行consumer

舉個例子,ifPresent方法執行Lambda表達式,将值轉換為大寫并列印:

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

filter(Predicate<? super T> predicate)方法

看方法名就知道,該方法是過濾方法,過濾符合條件的Optional對象,這裡的條件用Lambda表達式來定義,

如果入參predicate對象為null将抛NullPointerException異常,

如果Optional對象的值為null,将直接傳回該Optional對象,

如果Optional對象的值符合限定條件(Lambda表達式來定義),傳回該值,否則傳回空的Optional對象

源碼如下:

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

使用示例:

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

map(Function<? super T, ? extends U> mapper)方法

 前面的filter方法主要用于過濾,一般不會修改Optional裡面的值,map方法則一般用于修改該值,并傳回修改後的Optional對象

如果入參mapper對象為null将抛NullPointerException異常,

最後,執行傳入的lambda表達式,并傳回經lambda表達式操作後的Optional對象

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

flatMap(Function<? super T, Optional<U>> mapper)方法

flatMap方法與map方法基本一緻,唯一的差別是,

如果使用flatMap方法,需要自己在Lambda表達式裡将傳回值轉換成Optional對象,

而使用map方法則不需要這個步驟,因為map方法的源碼裡已經調用了Optional.ofNullable方法;

源碼:

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

orElse(T other)方法

很簡單,當值為null時傳回傳入的值,否則傳回原值;

orElseGet(Supplier<? extends T> other)方法

功能與orElse(T other)類似,不過該方法可選值的擷取不是通過參數直接擷取,而是通過調用傳入的Lambda表達式擷取

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例

orElseThrow(Supplier<? extends X> exceptionSupplier)方法

當遇到值為null時,根據傳入的Lambda表達式跑出指定異常

源碼

JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例
JAVA 8 Optional類介紹及其源碼什麼是Optional對象使用Optional對象的好處源碼及示例