一:引言
在平常的編碼之中,有一個錯誤總會在你的意料之外出現,那就是空指標例外,空指標的出現也很簡單,你得到了一個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更少的應用程式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546147.html
標籤:其他
上一篇:逐句回答,流式回傳,ChatGPT采用的Server-sent events后端實時推送協議Python3.10實作,基于Tornado6.1
下一篇:C++筆記--控制陳述句
