詳解Java如何判斷一個(gè)對(duì)象是否為空
我們?cè)趧傞_(kāi)始學(xué)習(xí)Java的時(shí)候,遇到過(guò)最多的異??隙ㄊ浅裘阎?strong>空指針異常(NullPointerException),可以說(shuō)它陪伴了我們整個(gè)初學(xué)階段。字符串、對(duì)象、集合等等一不留神就容易出現(xiàn)空指針異常! 那么如何優(yōu)雅的判斷一個(gè)對(duì)象是否為空并且減少空指針異常呢? 今天來(lái)介紹一個(gè)容器類(lèi)——Optional
Optional介紹
Optional是一個(gè)容器類(lèi),它只有兩種情況:
- 要么包含一個(gè)非空對(duì)象
- 要么為空
它有助于編寫(xiě)更健壯的代碼,以處理可能為空的值,而不必?fù)?dān)心空指針異常!
Optional用法
Optional的創(chuàng)建
Optional有以下兩種常見(jiàn)的創(chuàng)建方法:
- Optional.of(T value):創(chuàng)建一個(gè)包含非空值的Optional,如果value為null,則拋出NullPointerException
- Optional.ofNullable(T value):創(chuàng)建一個(gè)Optional,允許value為null
判斷Optional容器中是否包含對(duì)象
isPresent(): 返回一個(gè)布爾值,如果Optional容器中包含一個(gè)非空對(duì)象則返回true,否則返回false
獲取Optional容器的對(duì)象
- get(): 如果Optional包含非空值,返回該值;否則拋出NoSuchElementException
- orElse(T other): 如果Optional為空,返回指定的默認(rèn)值other
- orElseGet(Supplier<? extends T> other): 如果Optional為空,使用提供的Supplier函數(shù)生成默認(rèn)值
- orElseThrow(Supplier<? extends X> exceptionSupplier): 如果Optional為空,拋出由提供的Supplier函數(shù)生成的異常
過(guò)濾
filter(Predicate<? super T> predicate): 如果Optional包含非空值且滿(mǎn)足predicate條件,則返回當(dāng)前Optional,否則返回一個(gè)空Optional。
映射
- map(Function<? super T, ? extends U> mapper): 如果Optional包含非空值,應(yīng)用mapper函數(shù)并返回新的Optional。
- flatMap(Function<? super T, Optional> mapper): 類(lèi)似于map,但允許mapper函數(shù)返回Optional。
Optional示例
假如我們有一個(gè)User類(lèi),可以使用Optional來(lái)處理可能為空的User對(duì)象。User類(lèi)結(jié)構(gòu)如下:
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
示例:創(chuàng)建Optional
Optional userOptional = Optional.ofNullable(new User("張三"));
示例:判斷Optional是否包含對(duì)象
if (userOptional.isPresent()) {
System.out.println("用戶(hù)存在:" + userOptional.get().getName());
} else {
System.out.println("用戶(hù)不存在");
}
示例:獲取Optional容器的對(duì)象
User user = userOptional.orElse(new User("李四"));
System.out.println("User: " + user.getName());
示例:過(guò)濾
Optional<User> filteredUserOptional = userOptional.filter(u -> u.getName().startsWith("張"));
if (filteredUserOptional.isPresent()) {
System.out.println("結(jié)果:" + filteredUserOptional.get().getName());
} else {
System.out.println("未找到對(duì)應(yīng)用戶(hù)");
}
示例:映射
Optional<String> userNameOptional = userOptional.map(User::getName);
userNameOptional.ifPresent(name -> System.out.println("用戶(hù)名為: " + name));
使用場(chǎng)景總結(jié)
- 當(dāng)你從某個(gè)方法返回一個(gè)值,但該值可能為空,而調(diào)用者需要明確知道值是否存在。
- 在處理方法參數(shù)時(shí),你可以用Optional來(lái)表示某個(gè)參數(shù)可以為空,以提醒調(diào)用者可能會(huì)傳入null。
- 避免繁瑣的null檢查和條件語(yǔ)句,使代碼更簡(jiǎn)潔和可讀!
以上就是詳解Java如何判斷一個(gè)對(duì)象是否為空的詳細(xì)內(nèi)容,更多關(guān)于Java判斷對(duì)象是否為空的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot打印啟動(dòng)時(shí)異常堆棧信息詳解
在本篇文章里小編給大家整理的是關(guān)于SpringBoot打印啟動(dòng)時(shí)異常堆棧信息,有需要的朋友們可以學(xué)習(xí)下。2019-11-11
IDEA 工程里 new不出來(lái)Vue文件的圖文解決方案
這篇文章主要介紹了IDEA 工程里 new不出來(lái)Vue文件的解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
springboot實(shí)現(xiàn)發(fā)送QQ郵箱
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)發(fā)送QQ郵箱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
springboot?通過(guò)博途獲取plc點(diǎn)位的數(shù)據(jù)代碼實(shí)現(xiàn)
這篇文章主要介紹了springboot?通過(guò)博途獲取plc點(diǎn)位的數(shù)據(jù)的代碼實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù)
本篇文章主要介紹了詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
mybatis plus 的動(dòng)態(tài)表名的配置詳解
這篇文章主要介紹了mybatis plus 的動(dòng)態(tài)表名的配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

