Java8的Optional如何干掉空指針(示例詳解)
Optional概述
Optional 是個容器:它可以保存類型T的value,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測,很好地解決了空指針異常處理的問題,比如可以使用isPresent()方法判斷value是否為null,使用get()方法獲取value值等等。
Optional的構(gòu)造方法是私有的,實例不能new,可以使用靜態(tài)方法來創(chuàng)建:
// 1、創(chuàng)建一個包裝對象值為空的Optional對象
Optional<String> optStr = Optional.empty();
// 2、創(chuàng)建包裝對象值非空的Optional對象
Optional<String> optStr1 = Optional.of("optional");
// 3、創(chuàng)建包裝對象值允許為空的Optional對象
Optional<String> optStr2 = Optional.ofNullable(null);
Optional簡單案例
看完Optional的概述,我們用一個簡單的例子說明一下:
下面這段代碼接收一個User對象,如果user為null,則拋出異?!具@是一個非常常規(guī)的避免空指針異常的做法,如果沒有這步,getName會NPE】,否則返回user的name。
public String getName1(User user) {
if (user == null) {
throw new RuntimeException("user不能為null!");
}
return user.getName();
}
如果使用Optional,應該怎么去處理呢?
public String getName2(User user) {
return Optional.ofNullable(user) // 包裝user對象,如果user為null,則返回空的Optional對象
.map(User::getName)
.orElseThrow(() -> new RuntimeException("user不能為null"));// 如果有值則返回,沒有則拋出異常。
}
Optional使用靜態(tài)的ofNullable方法將user對象進行包裝,將可能為null的user對象保護起來。
public static <T> Optional<T> ofNullable(T value) {
// empty() 方法 創(chuàng)建一個空的Optional對象, of對象在構(gòu)造Optional的時候,value如果weinull,會引發(fā)NPE
return value == null ? empty() : of(value);
}
orElseThrow方法接收一個Supplier 對象,這里我們在lambda表達式那節(jié)已經(jīng)說過了,不再贅述,感興趣可以查看:Java8的Lambda表達式,你會不?
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
// 如果有值,直接返回值
if (value != null) {
return value;
} else {
// 拋出異常,這個異常Supplier接口定義
throw exceptionSupplier.get();
}
}
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 | 如果有值則將其返回,否則返回一個默認值 |
| orElseGet | 如果有值則將其返回,否則返回一個由指定的 Supplier 接口生成的值 |
| orElseThrow | 如果有值則將其返回,否則拋出一個由指定的 Supplier 接口生成的異常 |
參考閱讀
https://github.com/biezhi/learn-java8/blob/master/java8-optional/README.md
到此這篇關(guān)于Java8的Optional如何干掉空指針的文章就介紹到這了,更多相關(guān)Java8的Optional空指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java JDK8新增Optional工具類講解
- Java Optional<Foo>轉(zhuǎn)換成List<Bar>的實例方法
- 詳解JAVA中的OPTIONAL
- Java8 Optional判空詳解(簡化判空操作)
- Java8 Optional優(yōu)雅空值判斷的示例代碼
- java中Optional的使用詳細解析
- 詳解Java8中的lambda表達式、::符號和Optional類
- Java8 Optional的詳細使用教程
- Java中Optional的使用指南
- 如何使用Java中的Optional
- Java Optional解決空指針異??偨Y(jié)(java 8 功能)
- 利用Java8 Optional類優(yōu)雅如何地解決空指針問題
- Java8深入學習之熟透Optional
- Java關(guān)于JDK1.8中的Optional類
相關(guān)文章
單點登錄的概念及SpringBoot實現(xiàn)單點登錄的操作方法
在本文中,我們將使用Spring Boot構(gòu)建一個基本的單點登錄系統(tǒng),我們將介紹如何使用Spring Security和JSON Web Tokens(JWTs)來實現(xiàn)單點登錄功能,本文假設您已經(jīng)熟悉Spring Boot和Spring Security,感興趣的朋友一起看看吧2024-10-10
Java java.sql.Timestamp時間戳案例詳解
這篇文章主要介紹了Java java.sql.Timestamp時間戳案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
使用java8 API遍歷過濾文件目錄及子目錄和隱藏文件示例詳解
這篇文章主要介紹了使用java8API遍歷過濾文件目錄及子目錄及隱藏文件示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
springboot后端如何實現(xiàn)攜帶token登陸
這篇文章主要介紹了springboot后端如何實現(xiàn)攜帶token登陸,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
Spring Security OAuth2實現(xiàn)使用JWT的示例代碼
這篇文章主要介紹了Spring Security OAuth2實現(xiàn)使用JWT的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Java CharacterEncodingFilter案例詳解
這篇文章主要介紹了Java CharacterEncodingFilter案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08

