使用Optional更優雅地處理非空判斷

一:引言

      在平常的編碼之中,有一個錯誤總會在你的意料之外出現,那就是空指針異常。空指針的出現也很簡單,你得到了一個null對象,調用了一些方法,出現空指針異常。空指針會出現在各種地方,常見的比如Map.get()沒有獲取到對象就調用對象例的方法,類對象沒有獲取到就調用類中的方法。

   空指針的處理方式也很多,最簡單的方式就是用if/else判空,但是這樣就會顯得代碼特別繁瑣。

   在沒有用Optional判空之前,你是否也像下面的代碼一樣判空呢?如果是,請往下看,Optional 相對傳統判空的優勢。

  這篇文章就帶你用JDK8中的Optional來解決空指針異常。

  二:什麼是Optional

     Optional 類是一個可以爲null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。Optional 類的引入很好的解決空指針異常。Optional 的方法如下:

 三:Map集合空值判斷

   集合類型的判空在某些場景下會十分囉嗦,比如我最近剛遇到的一種場景,接收到的Map是這樣的:

{"user":{"info":{"address":"hz"}}}

這種時候如果按照常規的寫法,需要寫多層if語句進行判空

if (map.get("user")!=null){
    Map<String,Object> user = (Map<String, Object>) map.get("user");
    if (user.get("info")!=null){
        Map<String,Object> info = (Map<String, Object>) user.get("info");
        if (info.get("address")!=null){
            String address = (String) info.get("address");
            System.out.println(address);
        }
    }
}

if裏面套着if,結構十分複雜,這個時候我們就可以使用Optional

String address=Optional.ofNullable(map)
        .map(m->(Map<String,Object>)m.get("user"))
        .map(user->(Map<String,Object>)user.get("info"))
        .map(info->(String)info.get("address"))
        .orElse(null); 

四:對象類型空指判斷

首先構造一下簡單的對象:

@Data
public class User {
    private UserInfo info;
}

@Data
public class UserInfo {
    private String address;
}

  給User對象賦予基本的值

User user=new User();
UserInfo userInfo=new UserInfo();
userInfo.setAddress("hb");;
user.setInfo(userInfo);

   通常情況下在使用User對象時需要使用多層if/else判空,就像下面這樣:

if (user!=null){
    UserInfo info = user.getInfo();
    if (info!=null){
        String address = info.getAddress();
    }
}

 使用Optional就可以用一行代碼解決問題:

String address = Optional.ofNullable(user)
        .map(u -> u.getInfo())
        .map(info -> info.getAddress())
        .orElse(null);

  Optional還可以在普通的場景下使用,比如當某個值爲空時設置默認值:

User resultUser = Optional.ofNullable(user).orElse(new User());

 又比如判斷一個對象是否爲空:

boolean isPresent = Optional.ofNullable(user).isPresent();

五:總結

  Optional 是java非常有用的一個補充,它旨在減少代碼中的NullPointerExceptions,雖然不能百分之百的消除,但也是精心設計的。使用Optional 能更好的幫助我們創建可讀性強,bug更少的應用程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章