Java 8 引入了一個新的類——Optional,它可以有效地解決null指針異常。Optional可以提高代碼的可讀性,降低代碼出現空指針異常的風險。
一、Optional簡介
Optional是一個容器,它可以保存任意類型的值。Optional可以包含一個非null的值,也可以包含null。當Optional包含一個非null的值時,調用者可以使用get()方法取出這個值;如果Optional為空,那麼調用者可以指定一個默認值來代替這個null。Optional提供了一些有用的API來方便程序員的編程。
二、Optional的使用
1、創建Optional對象
Optional類中提供了如下幾種用於創建Optional對象的靜態工廠方法。
// 創建一個值為空的Optional對象 Optional emptyOptional = Optional.empty(); // 創建一個值非空的Optional對象 Optional notNullOptional = Optional.of("value"); // 創建一個值允許為空的Optional對象 Optional nullableOptional = Optional.ofNullable("value"); Optional emptyNullableOptional = Optional.ofNullable(null);
2、判斷Optional是否為空
Optional類中提供了isPresent()方法,用來判斷Optional是否非空。如果值存在則返回true,否則false。
Optional optional = Optional.ofNullable("value"); if (optional.isPresent()) { System.out.println("Optional不為空"); }
3、獲取Optional中的值
Optional類提供了get()方法來獲取Optional中的值。如果Optional不為空,則返回封裝的對象;否則拋出NoSuchElementException。
Optional optional = Optional.ofNullable("value"); String value = optional.get(); System.out.println(value);
4、當Optional為空時,設定默認值
Optional提供了一個orElse()方法,當Optional為空時可以指定一個默認值。
Optional nullableOptional = Optional.ofNullable(null); String orElse = nullableOptional.orElse("default"); System.out.println(orElse);
5、當Optional為空時,使用Supplier提供的默認值
orElseGet()方法與orElse()方法類似,當Optional為空時提供一個默認值。但是提供默認值的方式不同,orElse()方法會在Optional為空時創建默認值並返回,orElseGet()則會接受一個Supplier函數式介面,在Optional為空時,調用Supplier提供的方法進行計算並返回計算結果。
Optional nullableOptional = Optional.ofNullable(null); String orElse = nullableOptional.orElseGet(() -> "supplier"); System.out.println(orElse);
6、當Optional為空時拋出異常
orElseThrow()方法與orElse()方法類似,當Optional為空時會拋出一個由Supplier函數式介面提供的異常對象,或者拋出提供的異常類的異常對象。
Optional nullableOptional = Optional.ofNullable(null); String orElse = nullableOptional.orElseThrow(() -> new RuntimeException("異常"));
三、Optional的優勢及適用場景
Optional為程序員提供了一種新的處理null的方式,它的引入,可以更好地將代碼中的某些特殊情形暴露出來,有助於代碼的維護和調試。
Optional可以在某些情況下提高代碼的可讀性,可以更加清楚地表達出null的含義,避免了很多的判null處理,從而簡化了代碼。
Optional適用於返回結果為空的情況,並且這種空情況必須詳細處理,因為使用Optional會強製程序員處理掉這種情況,從根本上解決null引起的問題。
原創文章,作者:OASYX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/313559.html