Introduction
在Java 8之前,如果我們需要在代碼中表示一個值可能為空的情況,我們唯一能做的就是將它設置為null。然而,這種方式是非常容易出bug的。在Null指針異常(NullPointerException)的問題中,Java 語言有一個了不起的產物叫 Optional.
正文
Optional的概念
Java 8引入了一個Optional類,建議使用 Optional 類來表示一個值存在或不存在。這個對象可以包含非空的對象(存在),或者NULL(不存在)。使用 Optional 的目的不是去除 null,而是提供了一種可變空值類型,使得程序員可以更加註意程序中可能會出現的 null值,這有助於減少NullpointerException的發生。
什麼是Optional?
Optional是一個簡單的容器類,它可以代表一個值存在或不存在,而不是使用null值來表示“沒有值”這種情況。這樣可以避免大量的if(foo!=null)這樣的代碼,並且在某種程度上提高了代碼的可讀性。Java 8的這個特性已經被其它很多語言借鑒了。
Optional的運用
我們可以通過下面的方式創建 Optional 對象:
Optional optional = Optional.of("Hello World");
或者我們要在一個方法中返回一個對象時,我們可以這樣寫:
public Optional getCustomObject() {
if(condition == true) {
return Optional.of(new CustomObject());
} else {
return Optional.empty();
}
}
該方法可以避免返回值為null這種情況,並且可以在返回時立即知道返回值是否存在。
Optional的API
在 Optional 類中,包含很多有用的方法,這裡我們只介紹其中一些。
isPresent() 和 get()
isPresent(): 如果值存在返回true,否則返回false。
get(): 如果Optional有值則將其返回,否則拋出NoSuchElementException。
Optional optional = Optional.of("Hello World");
if(optional.isPresent()) {
System.out.println(optional.get()); // 輸出: Hello World
}
orElse()
如果有值則將其返回,否則返回一個默認值。
Optional optional = Optional.empty();
System.out.println(optional.orElse("Hello World")); // 輸出: Hello World
orElseGet()
orElseGet()方法與orElse()方法非常相似,但其中一個區別是提供用於計算默認值的Supplier。
Optional optional = Optional.empty();
Supplier supplier = () -> "Hello World";
System.out.println(optional.orElseGet(supplier)); // 輸出: Hello World
orElseThrow()
orElseThrow() 方法與orElse() 方法和 orElseGet() 方法類似,但是拋出的是傳入的異常類型。
Optional optional = Optional.empty();
try {
System.out.println(optional.orElseThrow(Exception::new)); // 拋出異常: Exception
} catch (Exception e) {
e.printStackTrace();
}
map()
如果有值,則對其執行調用mapping函數得到返回值。否則返回 Optional.empty()。
Optional optional = Optional.of("Hello World");
Optional upperOptional = optional.map(String::toUpperCase);
System.out.println(upperOptional.get()); // 輸出: HELLO WORLD
flatMap()
flatMap() 方法與 map() 方法類似,區別在於 flatMap 中的 mapping 函數返回值必須是 Optional。
Optional optional = Optional.of("Hello World");
Function<String, Optional> function = s -> Optional.of(s.toUpperCase());
Optional flatMapOptional = optional.flatMap(function);
System.out.println(flatMapOptional.get()); // 輸出: HELLO WORLD
小結
Optional提供了一個比null更好的方式來表示一個值不存在的情況。如果我們使用得當,它可以幫助我們避免NullPointException的發生。
整篇文章都着重於讓大家了解Optional是什麼,它們如何工作,以及為什麼對代碼質量有所幫助。記住,在正確地使用Optional時,代碼將更具可讀性,更加健壯。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/246538.html