前言:jdk 8爲什麼要設計Optional類呢?
爲了解決NullPointerException問題,減少代碼中的判空,實現jdk8的函數式編程,給開發者提供函數式的API。舉例看一下,如下圖我們平時在編碼的時候需要不斷的判斷對象是否爲空來做大量的處理
舉例操作如下
使用Optional之前需要進行大量的空指針處理
使用Optional之後這方面的處理顯得比較簡便,代碼更加的有優雅了
詳細分析Optional類中方法
Optional類中的方法依賴Objects類,Objects類是做什麼的呢?Objects類是一個對象工具類,提供操作對象的方法,如計算對象hash操作;null空值處理以及對象比較等方法。
Optional類裏面的靜態方法有empty()、of和ofNullable
empty()返回一個空的Optional對象,看一下源碼
此處的EMPTY通過new Optional<>()來返回一個空的Optional
我們可以發現這裏的Optional構造方法是私有的,也就是說不允許外部通過new的形式創建對象。構造方法是供Optional類內部使用。Optional內部維護一個value的變量,無參數構建的時候value爲null。
我們都是通過of和ofNullable方法來爲Optional中的value賦值的,那這兩個方法有什麼區別呢?
咱們先來看一下of方法的源碼
我們看到此方法通過私有的有參構造方法創建一個Optional對象,這個構造器都做了哪些操作呢?繼續往下看源碼
此方法調用Objects類的requireNonNull方法來給Optional的value賦值。下面是Objects的requireNonNull方法的實現
通過以上分析,我們可以得出兩個結論:通過of方法所構造出的Optional對象
當value值爲空時,會報NullPointerException異常
當value值不爲空時,正常構造Optional對象
那麼ofNullable方法的呢?下面我們看一下此方法的源碼
我們通過源碼可以看出,ofNullable方法在構造Optional的時候如果value爲空,那麼返回empty方法構建的Optional對象(一個Optional中value爲空的Optional對象),也就是說ofNullable支持空值的創建,而of方法不支持空值的創建,當value爲空時就會報空指針異常。
Optional類中的普通方法主要有get、isPresent以及ifPresent
其中get方法就是返回Optional中的value屬性,當value爲null時返回NoSuchElementException異常
而isPresent和ifPresent方法中,ifPresent方法是用來判斷Optional中的value是否爲空的,不爲空則返回true;而ifPresent方法是在Optional中value不爲空的情況下做一些操作,例如不爲空執行lambda表達式 Consumer。
下面來講解一下isPresent和ifPresent方法的用法
上圖代碼表示user不爲null的情況下輸出user
filter(Predicate<? super T> predicate),filter方法在Optional中value不爲空的情況下對Optional中的值進行過濾,如下圖
上圖代碼表示過濾掉Optional中user對象的name值不爲“”的返回Optional對象
map和flatMap
map和flatMap對Optional中的對象進行轉換值的操作,這兩個方法唯一的區別就是接受的參數不同
flatMap處理的參數爲Optional類型;上圖方法均是獲取Address寫法
orElse和orElseGet以及orElseThrow
orElse和orElseGet以及orElseThrow都是處理Optional值爲空的情況,如果傳入的value爲空,進行操作,orElseThrow在value爲空的情況拋出異常。orElse在orElseGet的區別在於:如果傳入的value不爲空,orElse中的操作仍然要執行。
如下圖,在user不爲空的情況下,仍然會輸出display和創建一個新的User對象