為什麼要設計optional?
為了解決nullpointerexception問題,減少**中的判空,實現函式式程式設計,給工程師們提供函式式的api。舉例看一下
如下圖我們平時在編碼的時候需要不斷的判斷物件是否為空來做大量的處理
但是使用optional後是如下這樣的
是不是很神奇?
下面詳細分析optional類中的方法
optional類中的方法依賴objects類,objects類是做什麼的呢?objects類是乙個物件工具類,提供操作物件的方法,如計算物件hash操作;null空值處理以及物件比較等方法。
靜態方法
empty()、of和ofnullable
empty()返回乙個空的optional物件,看一下原始碼
此處的empty通過new optional<>()來返回乙個空的optional
這裡的optional構造方法是私有的,也就是說不允許外部通過new的形式建立物件。構造方法是供optional類內部使用。optional內部維護這個乙個value的變數,無引數構建的時候value為null
我們都是通過of和ofnullable方法來為optional中的value賦值的,那這兩個方法有什麼區別呢?咱們看一下原始碼
此方法通過私有構造方法建立乙個optional物件,這個構造器都做了哪些操作呢?
此方法呼叫objects的requirenonnull方法來給optional的value賦值。下面是objects的requirenonnull方法的實現
通過以上分析,我們可以得出兩個結論:通過of方法所構造出的optional物件
當value值為空時,會報nullpointerexception異常
當value值不為空時,正常構造optional物件
那麼ofnullable方法的呢?下面我們看一下此方法的原始碼
通過原始碼可以看出,ofnullable方法在構造optional的時候如果value為空,那麼返回empty方法構建的optional物件(乙個optional中value為空的optional物件),也就是說ofnullable支援空值得建立
普通方法
get()
get方法就是返回optional中的value屬性
ispresent和ifpresent
ifpresent方法判斷optional中的value是否為空,不為空返回true;而ifpresent方法是在optional中value不為空的情況下做一些操作。
上圖**表示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物件
java8新特性之介面定義增強
一 介面定義的增強 從jdk1.8開始允許在介面中定義普通方法,使用default和static關鍵字,跟在訪問修飾符之後,兩種的區別是,default定義的普通方法用物件呼叫,static定義的方法用介面名呼叫 inte ce ibook static void study class booki...
java8新特性之Optional 的用法
optional.of t t 建立乙個 optional 例項 optional.empty 建立乙個空的 optional 例項 optional.ofnullable t t 若t 不為null 建立optional例項,否則建立空例項 ispresent 判斷是否包含值 orelse t t...
java8新特性之lambda表示式
lambda表示式需要支援函式式介面 介面中只有乙個抽象方法的介面 可以用 functionalinte ce註解修飾介面,這樣如果定義超過乙個抽象方法就會報錯 幾種格式 格式一 無引數,無返回值 system.out.println hello 格式二 有乙個引數,無返回值 x system.ou...