前言
Java 8 引入了 Optional 類別,用來優雅地處理可能為 null 的值,避免 NullPointerException。這篇文章介紹 Optional 的基本用法與常見應用場景。
Optional 是什麼?
Optional 是值的容器,只有兩種狀態:不是有值就是沒值。將輸入的值產生為 Optional 物件,這時 Optional 物件即為該值的容器。若要取回該值,必須使用 get() 方法。
將值轉為 Optional 的方法
of():接受非 null 的值並回傳Optional物件ofNullable():可以接受null 的值,回傳Optional物件
取得 Optional 內的值的方法
get():如果值存在就回傳這個值,否則就丟出NoSuchElementExceptionorElse(T other):如果值存在就回傳這個值,否則回傳otherorElseGet(Supplier<? extends T> other):如果值存在就回傳這個值,否則就呼叫other並回傳它的結果orElseThrow(Supplier<? extends X> exceptionSupplier):如果值存在就回傳這個值,否則就丟出由exceptionSupplier建立的例外
常用範例
在 Repository 可以直接用 Optional,這樣就可以避免資料庫互動時回 null 造成錯誤。
public interface DemoRepository extends JpaRepository<DemoEntity, String> {
Optional<DemoEntity> findByGuid(String guid);
}
在 Service 就可以依照以下方法使用它。
@RequiredArgsConstructor
@Service
@Slf4j
public class DemoService {
@Autowired
private DemoRepository demoRepository;
public GuidRs getGuidDetail(GuidRq param) {
GuidRs guidRs = new GuidRs();
// 利用 Optional 承接資料庫沒有這個值為 null
var optEntity = demoRepository.findByGuid(param.getGuid());
// 再用 isPresent() 方法判斷是否為 null
if (optEntity.isPresent()) {
// get() 可以取得 Optional 裡的物件
DemoEntity temp = optEntity.get();
guidRs.setSomething(temp.getSomething());
}
return guidRs;
}
}
總結
Optional 提供了優雅的方式來處理可能為 null 的值,避免 NullPointerException。善用 Optional 可以讓程式碼更加安全且易讀。