Java Optional:優(yōu)雅處理空值的藝術(shù)
在Java編程中,空指針異常(NullPointerException)是開發(fā)者經(jīng)常遇到的一個(gè)“坑”。為了更加優(yōu)雅地處理可能為null的對(duì)象,Java 8引入了Optional類。Optional是一個(gè)可以包含也可以不包含非null值的容器對(duì)象,它提供了一種更好的方式來處理可能為null的對(duì)象,避免直接使用null值導(dǎo)致的空指針異常。
1.基礎(chǔ)用法
創(chuàng)建Optional對(duì)象
- 使用Optional.of(T value):如果value為null,則拋出NullPointerException。
- 使用Optional.ofNullable(T value):允許value為null。
Optional<String> optionalString1 = Optional.of("Hello, World!");
Optional<String> optionalString2 = Optional.ofNullable(null); // 不拋出異常
獲取值
- 使用get():如果Optional對(duì)象包含值,則返回該值,否則拋出NoSuchElementException。
- 使用orElse(T other):如果Optional對(duì)象包含值,則返回該值,否則返回other。
String result1 = optionalString1.get(); // 返回 "Hello, World!"
String result2 = optionalString2.orElse("Default Value"); // 返回 "Default Value"
檢查值是否存在
- 使用isPresent():如果Optional對(duì)象包含值,則返回true,否則返回false。
- 使用ifPresent(Consumer consumer):如果Optional對(duì)象包含值,則執(zhí)行給定的操作。
boolean isPresent = optionalString1.isPresent(); // 返回 true
optionalString1.ifPresent(value -> System.out.println(value)); // 輸出 "Hello, World!"
2.高階用法
轉(zhuǎn)換值
- 使用map(Function mapper):如果Optional對(duì)象包含值,則對(duì)其應(yīng)用給定的函數(shù),返回包含結(jié)果的Optional對(duì)象。
Optional<Integer> optionalLength = optionalString1.map(String::length); // 返回 Optional[13]
平坦化Optional
- 使用flatMap(Function> mapper):如果Optional對(duì)象包含值,則對(duì)其應(yīng)用給定的函數(shù),并返回結(jié)果Optional對(duì)象;如果結(jié)果為null,則返回一個(gè)空的Optional對(duì)象。
Optional<String> optionalUpperCase = optionalString1.flatMap(value -> Optional.ofNullable(value.toUpperCase())); // 返回 Optional["HELLO, WORLD!"]
過濾值
- 使用filter(Predicate predicate):如果Optional對(duì)象包含的值滿足給定的謂詞條件,則返回該Optional對(duì)象;否則返回一個(gè)空的Optional對(duì)象。
Optional<String> optionalFiltered = optionalString1.filter(value -> value.contains("World")); // 返回 Optional["Hello, World!"]
Optional<String> optionalFilteredEmpty = optionalString1.filter(value -> value.contains("Java")); // 返回 Optional.empty()
自定義默認(rèn)值
- 使用orElseThrow(Supplier exceptionSupplier):如果Optional對(duì)象不包含值,則拋出由給定的Supplier提供的異常。
try {
String result3 = optionalString2.orElseThrow(() -> new IllegalArgumentException("Value is missing!"));
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage()); // 輸出 "Value is missing!"
}
代碼示例匯總
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
public class OptionalExample {
public static void main(String[] args) {
// 基礎(chǔ)用法
Optional<String> optionalString1 = Optional.of("Hello, World!");
Optional<String> optionalString2 = Optional.ofNullable(null);
String result1 = optionalString1.get(); // 獲取值
String result2 = optionalString2.orElse("Default Value"); // 使用默認(rèn)值
boolean isPresent = optionalString1.isPresent(); // 檢查值是否存在
optionalString1.ifPresent(value -> System.out.println(value)); // 如果存在,執(zhí)行操作
// 高階用法
Optional<Integer> optionalLength = optionalString1.map(String::length); // 轉(zhuǎn)換值
Optional<String> optionalUpperCase = optionalString1.flatMap(value -> Optional.ofNullable(value.toUpperCase())); // 平坦化Optional
Optional<String> optionalFiltered = optionalString1.filter(value -> value.contains("World")); // 過濾值
try {
String result3 = optionalString2.orElseThrow(() -> new IllegalArgumentException("Value is missing!")); // 自定義默認(rèn)值(拋出異常)
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}
3.小結(jié)
Optional類是Java 8引入的一個(gè)重要特性,它提供了一種更加優(yōu)雅和安全的方式來處理可能為null的對(duì)象。通過合理使用Optional,我們可以有效減少空指針異常的發(fā)生,使代碼更加健壯和易于維護(hù)。希望本文能幫助你更好地理解和應(yīng)用Optional。