Optional<T> 是一個容器物件,可包含非 null 值或空值。主要方法:
isPresent():值非 null 返回 trueget():取得值,若為 null 拋出 NoSuchElementExceptionorElse(T other):值為 null 時返回預設值ifPresent(Consumer<T>):值非 null 時執行程式碼if (obj != null) 判斷,支援鏈式呼叫private static final Optional<?> EMPTY = new Optional<>();
private final T value;
private Optional() { this.value = null; } // 空值
private Optional(T value) { this.value = Objects.requireNonNull(value); } // 非空值
public static<T> Optional<T> empty() { return (Optional<T>) EMPTY; }
public static<T> Optional<T> of(T value) { return new Optional<>(value); }
public static<T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
| 方法 | 說明 |
|---|---|
| get() | 取得值,null 拋異常 |
| isPresent() | 判斷值非 null |
| ifPresent(Consumer) | 值非 null 執行 Consumer |
| filter(Predicate) | 符合條件返回自身,否則返回 empty() |
| map(Function) | 轉換值並包裝為新 Optional |
| flatMap(Function) | 類似 map,但 Lambda 需自行返回 Optional |
| orElse(T) | null 時返回參數值 |
| orElseGet(Supplier) | null 時執行 Supplier 取得值 |
| orElseThrow(Supplier) | null 時拋出指定異常 |
// 範例 1:安全取值與預設值
Optional<String> opt = Optional.ofNullable(getName());
String name = opt.orElse("預設名稱");
// 範例 2:條件執行
opt.ifPresent(n -> System.out.println(n.toUpperCase()));
// 範例 3:鏈式操作
Optional<String> result = opt
.filter(s -> s.length() > 3)
.map(String::toUpperCase);
ofNullable() 而非 of() 避免 NPEget(),改用 orElse()、orElseGet() 或 ifPresent()map()/flatMap() 進行函數式轉換Java 8 Optional 雖非銀彈,但正確使用能顯著提升程式碼健壯性與可讀性。