【Java8新特性】Optional類在處理空值判斷場景的應用 迴避空指標異常 編寫健壯的應用程式

Java知識圖譜發表於2022-02-24

一、序言

空值異常是應用執行時常見的異常,傳統方式為了編寫健壯的應用,常常使用多層巢狀邏輯判斷迴避空指標異常。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;
}

相關SetterGetter方法自行新增。

(二)模擬演示

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的優點展現出來。從場景入手學技術比單調的技術講解更有趣味。

相關文章