Java8新特性之Optional使用詳解
簡介
- 空指針異常是導致Java應用程序失敗的最常見原因。
- 為了解決空指針異常更加優(yōu)雅,Java8 提供了 Optional 類庫。
- Optional 實際上是個容器:它可以保存類型T的值,或者僅僅保存null。
- Optional 提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
代碼示例
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,則調用consumer對象,否則不調用
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// 如果不是null,調用Consumer
optional1.ifPresent(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println("value is " + t);
}
});
// null,不調用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 中保存的值進行函數(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());// key1Optional類的方法
| 方法 | 描述 |
| empty | 返回一個空的 Optional 實例 |
| filter | 如果值存在并且滿足提供的斷言, 就返回包含該值的 Optional 對象;否則返回一個空的 Optional 對象 |
| map | 如果值存在,就對該值執(zhí)行提供的 mapping 函數(shù)調用 |
| flatMap | 如果值存在,就對該值執(zhí)行提供的 mapping 函數(shù)調用,返回一個 Optional 類型的值,否則就返 回一個空的 Optional 對象 |
| get | 如果該值存在,將該值用 Optional 封裝返回,否則拋出一個 NoSuchElementException 異常 |
| ifPresent | 如果值存在,就執(zhí)行使用該值的方法調用,否則什么也不做 |
| isPresent | 如果值存在就返回 true,否則返回 false |
| of | 將指定值用 Optional 封裝之后返回,如果該值為 null,則拋出一個 NullPointerException 異常 |
| ofNullable | 將指定值用 Optional 封裝之后返回,如果該值為 null,則返回一個空的 Optional 對象 |
| orElse | 如果有值則將其返回,否則返回一個默認值 |
| orElseGet | 如果有值則將其返回,否則返回一個由指定的 Supplier 接口生成的值 |
| orElseThrow | 如果有值則將其返回,否則拋出一個由指定的 Supplier 接口生成的異常 |
到此這篇關于Java8新特性之Optional使用詳解的文章就介紹到這了,更多相關Java8的Optional內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IDEA創(chuàng)建Servlet程序的兩種實現(xiàn)方法
Servlet是JavaWeb應用程序中不可或缺的組件之一,本文主要介紹了IDEA創(chuàng)建Servlet程序的兩種實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下2023-10-10
Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名
這篇文章主要介紹了Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名,本文把代碼組織成了一個模塊,可以很方便的使用,需要的朋友可以參考下2015-06-06
java 中的static關鍵字和final關鍵字的不同之處
java 中的static關鍵字和final關鍵字的不同之處,需要的朋友可以參考一下2013-03-03

