使用JDK8的新特性-Optional來避免Java空指標異常
阿新 • • 發佈:2021-11-08
什麼是Optional
領域模型概念可參考:淺談領域模型
使用Optional
package com.github.ybqdren; import java.util.Optional; /** * Wen(Joan) Zhao <[email protected]> * 2021/11/6 */ @SuppressWarnings("all") public class OptionalUsage { public static class User{ private String name; public String getName(){ return name; } } private static User anoymos(){ return new User(); } public static void main(String[] args) { } }
不推薦這樣使用Optional
private static void isUserEqualNull(){
Optional<User> optional = Optional.empty();
if(optional.isPresent()){ // 是否為空,為空返回false 不為空返回true
System.out.println("User is not null");
}else{
System.out.println("User is null");
}
}
因為上面這種判空的方法與下面這種直接判斷是否是NULL幾乎一樣:
// 常見的一種判空方法
private static void isUserEqualNull_2(){
User user = null;
if(user != null){
System.out.println("User is not null");
}else{
System.out.println("User is null");
}
}
所以,這樣使用新的API意義不大。
使用optional提供的API來判定物件是否為NULL
User user = null;
.ofNullable() 如果為空就返回一個空的Optoinal例項 如果不為空就返回User的示例
Optional<User> optionalUser = Optional.ofNullable(user);
orElse() 存在即返回傳入的物件,空則提供預設值
optionalUser.orElse(new User());
orElseGet() 存在即返回,空則由函式區產生 此方法複用性更強
optionalUser.orElseGet(() -> anoymos());
orElseThrow() 存在即返回,否則丟擲異常
optionalUser.orElseThrow(RuntimeException::new);
ifPresent() 存在才去做相應的處理
optionalUser.ifPresent(u -> System.out.println(u.getName()));
map() 對Optional中的物件執行某種操作,且會返回一個Optional物件
optionalUser.map(u -> u.getName()).orElse("anymos");
執行流程分析:
- map 獲取optionalUser的name屬性 獲取到之後被map方法封裝為一個optional物件。
- 獲取到的optional物件是一個string型別 這個string型別的optional有可能也是空。
- 對這個物件使用orElse()方法進行判定,如果為空就返回預設值"anymos"。
map是可以無限級聯的
optionalUser.map(u->u.getName()).map(name->name.length()).orElse(0);
應該注意的地方
Optional中的get ifPresent這樣的方法更應該看作是私有的方法,因此不要直接去使用。
參考引用
本文來自部落格園,作者:趙雯_後端開發工程師,轉載請註明原文連結:https://www.cnblogs.com/ybqdren/p/15518485.html