一、序言
空值異常是應(yīng)用運行時常見的異常宛逗,傳統(tǒng)方式為了編寫健壯的應(yīng)用帖池,常常使用多層嵌套邏輯判斷
回避空指針異常。Java8新特性之Optional
為此類問題提供了優(yōu)雅的解決方式慌申。
廣大程序員朋友對空值異衬把。刻骨銘心,因此Optional
一經(jīng)推出蹄溉,廣受贊譽咨油。
二、問題復(fù)原
(一)素材準(zhǔn)備
public class LoginUser implements UserDetails {
private Long deptId;
private String token;
private Long loginTime;
private Long expireTime;
private String ipaddr;
private String loginLocation;
private String browser;
private String os;
private SysUser user;
}
public class SysUser {
private Long userId;
private Long deptId;
private String userName;
}
相關(guān)Setter
和Getter
方法自行添加柒爵。
(二)模擬演示
1役电、傳統(tǒng)方式
/**
* 普通嵌套判斷方式判斷空值
*
* @param loginUser 登錄用戶體
* @return 用戶ID
*/
public Long getUserId(LoginUser loginUser){
if (loginUser!=null) {
SysUser user = loginUser.getUser();
if (user!=null) {
return user.getUserId();
}
}
return null;
}
方法參數(shù)傳遞的變量loginUser
使用前不確定是否為空,因此需要邏輯判斷棉胀;user
變量使用前不確定是否為空法瑟,因此需要邏輯判斷。兩層邏輯判斷之后唁奢,方能安心調(diào)用獲取UserId
方法霎挟。
顯而易見,當(dāng)對象嵌套層次較深時驮瞧,需要做的邏輯判斷越多氓扛,代碼越復(fù)雜。
2、優(yōu)雅方式
/**
* 通過Optinal處理空值判斷
*
* @param loginUser 登錄用戶體
* @return 用戶ID
*/
public Long getUserId(LoginUser loginUser) {
return Optional.ofNullable(loginUser)
.map(LoginUser::getUser).map(SysUser::getUserId).orElse(null);
}
在滿足同樣需求的前提下采郎,使用Optional
類代碼量更少千所,業(yè)務(wù)邏輯更清晰。
Optional
使用方法引用的語法蒜埋,屬于Lambda表達式
的一種淫痰。
三、小結(jié)
本文介紹了Optional類在處理空值判斷場景的應(yīng)用整份,通過對比的方式待错,將Optional的優(yōu)點展現(xiàn)出來。從場景入手學(xué)技術(shù)比單調(diào)的技術(shù)講解更有趣味烈评。
喜歡本文點個??贊??支持一下火俄,關(guān)注我下期再見,相關(guān)源碼在GitHub讲冠,視頻講解在B站瓜客,本文收藏在專題博客。