在平常的編碼之中,有一個錯誤總會在你的意料之外出現,那就是空指針異常。空指針的出現也很簡單,你得到了一個null對象,調用了一些方法,出現空指針異常。空指針會出現在各種地方,常見的比如Map.get()沒有獲取到對象就調用對象例的方法,類對象沒有獲取到就調用類中的方法。
空指針的處理方式也很多,最簡單的方式就是用if/else判空,但是這樣就會顯得代碼特別繁瑣。這篇文章就帶你用JDK8中的Optional來解決空指針異常。
什么是Optional
Optional類是Java 8的新特性,Optional的使用很簡單,介紹幾種常用的方法:
1、Optional.of():傳遞參數,如果of中的對象是null,就報空指針異常。
Optional<T> optional = Optional.of()
2、Optional.ofNullable():允許ofNullable傳遞null對象
Optional<T> optional = Optional.ofNullable();
3、Optional.empty():返回空的Optional實例
Optional<T> optional = Optional.empty();
4、optional.isPresent():判斷Optional實例是否為空
optional.isPresent()
5、optional.orElse():如果optional為空的話返回orElse中的對象
optional.orElse()
6、optional.get():獲取optional中的T對象
optional.get();
7、optional.map():如果optional不為null,則執行map方法中的映射函數得到返回值。
optional.map(Function<? super T,? extends U> mapper)
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("hz");;
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();
