Java8新特性之Optional使用詳解
簡介
- 空指針異常是導(dǎo)致Java應(yīng)用程序失敗的最常見原因。
- 為了解決空指針異常更加優(yōu)雅,Java8 提供了 Optional 類庫。
- Optional 實際上是個容器:它可以保存類型T的值,或者僅僅保存null。
- Optional 提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測。
代碼示例
Optional.of() 或者 Optional.ofNullable() :創(chuàng)建 Optional 對象,差別在于 of 不允許參數(shù)是 null ,而 ofNullable 則無限制。
// 參數(shù)不能是null Optional optional1 = Optional.of(1); // 參數(shù)可以是null Optional optional2 = Optional.ofNullable(null); // 參數(shù)可以是非null Optional optional3 = Optional.ofNullable(2);
Optional.empty() :所有null包裝成的 Optional 對象
Optional optional1 = Optional.ofNullable(null); Optional optional2 = Optional.ofNullable(null); System.out.println(optional1 == optional2);// true System.out.println(optional1 == Optional.empty());// true Object o1 = Optional.empty(); Object o2 = Optional.empty(); System.out.println(o1 == o2);// true
isPresent() :判斷值是否存在
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Integer> optional2 = Optional.ofNullable(null); // isPresent判斷值是否存在 System.out.println(optional1.isPresent() == true); System.out.println(optional2.isPresent() == false);
ifPresent(Consumer consumer) :如果option對象保存的值不是null,則調(diào)用consumer對象,否則不調(diào)用
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Integer> optional2 = Optional.ofNullable(null); // 如果不是null,調(diào)用Consumer optional1.ifPresent(new Consumer<Integer>() { @Override public void accept(Integer t) { System.out.println("value is " + t); } }); // null,不調(diào)用Consumer optional2.ifPresent(new Consumer<Integer>() { @Override public void accept(Integer t) { System.out.println("value is " + t); } });
orElse(value) :如果optional對象保存的值不是 null ,則返回原來的值,否則返回 value
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Integer> optional2 = Optional.ofNullable(null); // orElse System.out.println(optional1.orElse(1000) == 1);// true System.out.println(optional2.orElse(1000) == 1000);// true
orElseGet(Supplier supplier) :功能與 orElse 一樣,只不過 orElseGet 參數(shù)是一個對象
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Integer> optional2 = Optional.ofNullable(null); System.out.println(optional1.orElseGet(() -> 1000) == 1);//true System.out.println(optional2.orElseGet(() -> 1000) == 1000);//true
orElseThrow() :值不存在則拋出異常,存在則什么不做,有點類似 Guava 的 Precoditions
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Integer> optional2 = Optional.ofNullable(null); optional1.orElseThrow(() -> { throw new IllegalStateException(); }); try { optional2.orElseThrow(() -> { throw new IllegalStateException(); }); } catch (IllegalStateException e) { e.printStackTrace(); }
filter(Predicate) :判斷 Optional 對象中保存的值是否滿足 Predicate ,并返回新的 Optional 。
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Integer> optional2 = Optional.ofNullable(null); Optional<Integer> filter1 = optional1.filter((a) -> a == null); Optional<Integer> filter2 = optional1.filter((a) -> a == 1); Optional<Integer> filter3 = optional2.filter((a) -> a == null); System.out.println(filter1.isPresent());// false System.out.println(filter2.isPresent());// true System.out.println(filter2.get().intValue() == 1);// true System.out.println(filter3.isPresent());// false
map(Function) :對 Optional 中保存的值進(jìn)行函數(shù)運算,并返回新的 Optional (可以是任何類型)
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Integer> optional2 = Optional.ofNullable(null); Optional<String> str1Optional = optional1.map((a) -> "key" + a); Optional<String> str2Optional = optional2.map((a) -> "key" + a); System.out.println(str1Optional.get());// key1 System.out.println(str2Optional.isPresent());// false
flatMap() :功能與 map() 相似,差別請看如下代碼。 flatMap 方法與 map 方法類似,區(qū)別在于 mapping 函數(shù)的返回值不同。 map 方法的 mapping 函數(shù)返回值可以是任何類型 T ,而 flatMap 方法的 mapping 函數(shù)必須是 Optional 。
Optional<Integer> optional1 = Optional.ofNullable(1); Optional<Optional<String>> str1Optional = optional1.map((a) -> Optional.of("key" + a)); Optional<String> str2Optional = optional1.flatMap((a) -> Optional.of("key" + a)); System.out.println(str1Optional.get().get());// key1 System.out.println(str2Optional.get());// key1
Optional類的方法
方法 | 描述 |
empty | 返回一個空的 Optional 實例 |
filter | 如果值存在并且滿足提供的斷言, 就返回包含該值的 Optional 對象;否則返回一個空的 Optional 對象 |
map | 如果值存在,就對該值執(zhí)行提供的 mapping 函數(shù)調(diào)用 |
flatMap | 如果值存在,就對該值執(zhí)行提供的 mapping 函數(shù)調(diào)用,返回一個 Optional 類型的值,否則就返 回一個空的 Optional 對象 |
get | 如果該值存在,將該值用 Optional 封裝返回,否則拋出一個 NoSuchElementException 異常 |
ifPresent | 如果值存在,就執(zhí)行使用該值的方法調(diào)用,否則什么也不做 |
isPresent | 如果值存在就返回 true,否則返回 false |
of | 將指定值用 Optional 封裝之后返回,如果該值為 null,則拋出一個 NullPointerException 異常 |
ofNullable | 將指定值用 Optional 封裝之后返回,如果該值為 null,則返回一個空的 Optional 對象 |
orElse | 如果有值則將其返回,否則返回一個默認(rèn)值 |
orElseGet | 如果有值則將其返回,否則返回一個由指定的 Supplier 接口生成的值 |
orElseThrow | 如果有值則將其返回,否則拋出一個由指定的 Supplier 接口生成的異常 |
到此這篇關(guān)于Java8新特性之Optional使用詳解的文章就介紹到這了,更多相關(guān)Java8的Optional內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA創(chuàng)建Servlet程序的兩種實現(xiàn)方法
Servlet是JavaWeb應(yīng)用程序中不可或缺的組件之一,本文主要介紹了IDEA創(chuàng)建Servlet程序的兩種實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下2023-10-10Java獲取接口的所有實現(xiàn)類方法總結(jié)示例
這篇文章主要給大家介紹了關(guān)于Java獲取接口的所有實現(xiàn)類方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-06-06Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名
這篇文章主要介紹了Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名,本文把代碼組織成了一個模塊,可以很方便的使用,需要的朋友可以參考下2015-06-06java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處
java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處,需要的朋友可以參考一下2013-03-03關(guān)于MyBaties的基本配置標(biāo)簽總結(jié)
今天給大家?guī)淼氖顷P(guān)于MyBaties基礎(chǔ)的相關(guān)知識,文章圍繞著MyBaties的基本配置標(biāo)簽展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06