hello啊,各位觀眾姥爺們!!!本baby今天又來了!哈哈哈哈哈嗝🐶
Java中的Optional了解多少?
在 Java 中,Optional
是 Java 8 引入的一個容器類,用于顯式處理可能為 null
的值,避免 NullPointerException
(空指針異常)。它的核心思想是將“空值”包裝成一個對象,通過鏈式調用強制本baby顯式處理空值場景,提升代碼的可讀性和健壯性。
1. Optional 的核心設計
- 不可變容器:
Optional
對象一旦創建,其內部的值不可修改。 - 明確語義:通過方法名(如
isPresent()
、orElse()
)明確表達值的“存在性”和“默認值”邏輯。 - 鏈式調用:支持函數式風格的鏈式操作(如
map()
、filter()
)。
2. 創建 Optional
方法 | 描述 |
---|---|
Optional.empty() | 創建一個空的 Optional 對象(值為 null )。 |
Optional.of(T) | 創建非空 Optional ,若值為 null 會拋出 NullPointerException 。 |
Optional.ofNullable(T) | 創建 Optional ,若值為 null ,返回 Optional.empty() 。 |
示例:
Optional<String> emptyOpt = Optional.empty();
Optional<String> nameOpt = Optional.of("葉文潔");
Optional<String> nullableOpt = Optional.ofNullable(getName()); // getName() 可能返回 null
3. 常用操作方法
(1) 檢查值是否存在
方法 | 描述 |
---|---|
isPresent() | 判斷值是否存在(非 null )。 |
isEmpty() | 判斷值是否為空(Java 11+)。 |
示例:
if (nameOpt.isPresent()) {System.out.println("Name: " + nameOpt.get());
}
(2) 獲取值
方法 | 描述 |
---|---|
get() | 直接獲取值,若值為 null 拋出 NoSuchElementException 。不推薦直接使用。 |
orElse(T) | 值存在時返回值,否則返回默認值。 |
orElseGet(Supplier) | 值存在時返回值,否則通過 Supplier 生成默認值(延遲計算)。 |
orElseThrow() | 值存在時返回值,否則拋出指定異常(Java 10+)。 |
示例:
String name1 = nameOpt.orElse("Unknown"); // 默認值
String name2 = nameOpt.orElseGet(() -> fetchDefaultName()); // 延遲計算
String name3 = nameOpt.orElseThrow(() -> new IllegalStateException("Name not found"));
(3) 鏈式操作
方法 | 描述 |
---|---|
map(Function) | 對值進行轉換,若值為空,返回 Optional.empty() 。 |
flatMap(Function) | 類似 map ,但 Function 需返回 Optional ,避免嵌套 Optional 。 |
filter(Predicate) | 過濾值,若條件不滿足,返回 Optional.empty() 。 |
示例:
Optional<User> userOpt = Optional.ofNullable(user);
String email = userOpt.map(User::getAddress).map(Address::getEmail).orElse("no-email@luoji.com");
4. 使用場景與最佳實踐
(1) 適用場景
- 返回值可能為
null
的方法:public Optional<User> findUserById(int id) {// 如果找不到,返回 Optional.empty() }
- 鏈式處理嵌套對象:避免深層
if (obj != null)
檢查。 - 顯式表達“空值”語義:強制調用方處理可能的空值。
(2) 避免的陷阱
-
不要濫用
Optional
:- 不要用
Optional
作為方法參數或類的字段(違反設計初衷)。 - 不要用
Optional
代替集合(如Optional<List>
應直接用空集合Collections.emptyList()
)。
- 不要用
-
避免
isPresent() + get()
組合:// 不推薦: if (opt.isPresent()) {String value = opt.get(); }// 推薦: opt.ifPresent(value -> {...});
5. Java 9+ 的增強
Java 9 對 Optional
進行了擴展,新增方法:
方法 | 描述 |
---|---|
ifPresentOrElse() | 值存在時執行一個操作,否則執行另一個操作。 |
or() | 值存在時返回當前 Optional ,否則返回另一個 Optional 。 |
stream() | 將 Optional 轉換為 Stream 。 |
示例:
nameOpt.ifPresentOrElse(name -> System.out.println("Name: " + name),() -> System.out.println("Name not found")
);
🐮🐎
Optional
的核心價值是強制開發者顯式處理空值,減少NullPointerException
。- 推薦鏈式操作(如
map()
、flatMap()
)代替直接檢查isPresent()
。 - 避免濫用,僅用于方法返回值,而非參數或字段。
- Java 9+ 提供更豐富的鏈式操作(如
ifPresentOrElse()
)。
正確使用 Optional
可以讓代碼更簡潔、安全,但需結合場景合理選擇其與傳統的 null
檢查。