一、序言
空值異常是應用執行時常見的異常,傳統方式為了編寫健壯的應用,常常使用多層巢狀邏輯判斷
迴避空指標異常。Java8新特性之Optional
為此類問題提供了優雅的解決方式。
廣大程式設計師朋友對空值異常刻骨銘心,因此Optional
一經推出,廣受讚譽。
二、問題復原
(一)素材準備
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;
}
相關Setter
和Getter
方法自行新增。
(二)模擬演示
1、傳統方式
/**
* 普通巢狀判斷方式判斷空值
*
* @param loginUser 登入使用者體
* @return 使用者ID
*/
public Long getUserId(LoginUser loginUser){
if (loginUser!=null) {
SysUser user = loginUser.getUser();
if (user!=null) {
return user.getUserId();
}
}
return null;
}
方法引數傳遞的變數loginUser
使用前不確定是否為空,因此需要邏輯判斷;user
變數使用前不確定是否為空,因此需要邏輯判斷。兩層邏輯判斷之後,方能安心呼叫獲取UserId
方法。
顯而易見,當物件巢狀層次較深時,需要做的邏輯判斷越多,程式碼越複雜。
2、優雅方式
/**
* 通過Optinal處理空值判斷
*
* @param loginUser 登入使用者體
* @return 使用者ID
*/
public Long getUserId(LoginUser loginUser) {
return Optional.ofNullable(loginUser)
.map(LoginUser::getUser).map(SysUser::getUserId).orElse(null);
}
在滿足同樣需求的前提下,使用Optional
類程式碼量更少,業務邏輯更清晰。
Optional
使用方法引用的語法,屬於Lambda表示式
的一種。
三、小結
本文介紹了Optional類在處理空值判斷場景的應用,通過對比的方式,將Optional的優點展現出來。從場景入手學技術比單調的技術講解更有趣味。