NullPointerException
是目前Java 程序開發中最典型的異常,它讓你的代碼充斥着深度嵌套的null 檢查,代碼的可讀性糟糕透頂。
null 自身沒有任何的語義,尤其是,它代表的是在靜態類型語言中以一種錯誤的方式對缺失變量值的建模。
Java 一直試圖避免讓程序員意識到指針的存在,唯一的例外是:null 指針。
null 並不屬於任何類型,這意味着它可以被賦值給任意引用類型的變量。這會導致問題,原因是當這個變量被傳遞到系統中的另一個部分后,你將無法獲知這個null 變量最初的賦值到底是什么類型。
Java 8 中引入了一個新的類java.util.Optional<T>。這是一個封裝Optional 值的類。
使用optional類解決空指針
變量存在時,Optional 類只是對類簡單封裝。變量不存在時,缺失的值會被建模成一個“空”的Optional 對象,由方法Optional.empty()返回。
Optional.empty()方法是一個靜態工廠方法,它返回Optional 類的特定單一實例。
創建Optional 對象
1. 聲明一個空的Optional
正如前文所述,你可以通過靜態工廠方法Optional.empty 創建一個空的Optional 對象:
Optional<Car> optCar = Optional.empty();
2. 依據一個非空值創建Optional
你還可以使用靜態工廠方法Optional.of 依據一個非空值創建一個Optional 對象:
Optional<Car> optCar = Optional.of(car);
如果car 是一個null,這段代碼就會立即拋出一個NullPointerException,而不是等到你試圖訪問car 的屬性值時才返回一個錯誤。
3. 可接受null 的Optional
最后,使用靜態工廠方法Optional.ofNullable,你可以創建一個允許null 值的Optional 對象:
Optional<Car> optCar = Optional.ofNullable(car);
如果car 是null,那么得到的Optional 對象就是個空對象。
Optional 類的方法方 法
方 法 描 述 empty 返回一個空的Optional 實例 filter 如果值存在並且滿足提供的謂詞,就返回包含該值的Optional 對象;否則返回一個空的Optional 對象 flatMap 如果值存在,就對該值執行提供的mapping 函數調用,返回一個Optional 類型的值,否則就返回一個空的Optional 對象 get 如果值存在,就將該值用Optional 封裝返回,否則拋出一個NoSuchElement Exception異常 ifPresent 如果值存在,就執行使用該值的方法調用,否則什么也不做 ifPresentOrElse 如果值存在,就以值作為輸入執行對應的方法調用,否則執行另一個不需任何輸入的方法 isPresent 如果值存在就返回true,否則返回falsemap 如果值存在, 就對該值執行提供的mapping 函數調用of 將指定值用Optional 封裝之后返回,如果該值為null,則拋出一個NullPointerException異常 ofNullable 將指定值用Optional 封裝之后返回,如果該值為null,則返回一個空的Optional 對象
or 如果值存在,就返回同一個Optional 對象,否則返回由支持函數生成的另一個Optional 對象 orElse 如果有值則將其返回,否則返回一個默認值 orElseGet 如果有值則將其返回,否則返回一個由指定的Supplier 接口生成的值 orElseThrow 如果有值則將其返回,否則拋出一個由指定的Supplier 接口生成的異常 stream 如果有值,就返回包含該值的一個Stream,否則返回一個空的Stream
用Optional 封裝可能為null 的值
Optional<Object> value = Optional.ofNullable(map.get("key"));
以下是本章中的關鍵概念。
null 引用在歷史上被引入到程序設計語言中,目的是為了表示變量值的缺失。
Java 8 中引入了一個新的類java.util.Optional,對存在或缺失的變量值進行建模。
你可以使用靜態工廠方法Optional.empty、Optional.of 以及Optional.ofNullable
創建Optional 對象。
Optional 類支持多種方法,比如map、flatMap、filter,它們在概念上與Stream
類中對應的方法十分相似。
使用Optional 會迫使你更積極地解引用Optional 對象,以應對變量值缺失的問題,
最終,你能更有效地防止代碼中出現不期而至的空指針異常。
使用Optional 能幫助你設計更好的API,用戶只需要閱讀方法簽名,就能了解該方法
是否接受一個Optional 類型的值。