java optional 用法_Java 8中的Optional: 如何正确使用?
Java 8中出現一個新的Optional類型,和其他語言中null的替代品類似。 本文將討論如何使用這種新類型,即它的主要用例是什么。
什么是Optional類型?
Optional是對單個對象包裝的容器類型。Optional同樣可以包裝null。舉例如下:
public Optional findCustomerWithSSN(String ssn){
...
}
復制代碼
返回值由Optional包裝了一層,語義上明確地表達了值為ssn的Customer對象是有可能不存在的。
這代表著從系統類型上明確的強制該方法調用者,考慮并處理Customer對象為null的可能性。
調用者不得不采用判斷的處理方式:
Optional optional = findCustomerWithSSN(ssn);
if (optional.isPresent()) {
Customer customer = optional.get();
... use customer ...
}
else {
... deal with absence case ...
}
復制代碼
或者提供默認值的處理方式:
public static Optional findOptionalLong(){
return Optional.empty();
}
Long value = findOptionalLong(ssn).orElse(0L);
復制代碼
這種使用Optional的方法類似于拋出異常的情況。 通過拋出一個已捕獲的異常,我們使用編譯器來強制API的調用者以某種方式處理異常情況。
Optional想解決什么問題?
Optional通過包裝一個對象,形成一個更具表現力的容器,用來減少Java系統中空指針異常的數量,Optional的API考慮了返回值丟失為null的可能性。
如果Java最開始就有Optional類,那么大多數庫和應用程序可能會更好地處理丟失的返回值,減少空指針異常的數量和錯誤總數。
Optional沒想解決什么問題?
Optional并不意味著是一種避免所有類型空指針的機制。
和null一樣,Optional無法表達缺失值具體代表什么。比如說,null可以表示許多不同的事物(未找到值,變量未初始化等),但只是看到null這個值的時候并不知道是哪種情況,Optional同理。
Optional對函數文檔的幫助有限,函數的調用者仍然需要查看函數的javadoc以理解Optional缺失值的含義,以便做出正確處理。
Optional的get()方法同樣會產生空指針異常。
只返回null有什么問題?
問題在于函數的調用者可能沒有閱讀函數的javadoc,忘記處理null。
這種情況經常發生,并且是空指針異常的主要原因之一。
Optional應該被怎樣使用?
在返回值可能為null的函數中,Optional應該用做其返回類型。
在域驅動程序開發的上下文中使用,比如說某些服務,存儲庫或實用程序方法。
Optional不應該被怎樣使用?
Optional不適合在下列場景中使用,不會有任何好處:
在域模型層(不可序列化)
在DTO中(不可序列化)
函數的輸入參數
構造函數的參數
函數式編程對Optional起到怎樣的幫助?
在鏈式函數調用中,Optional提供方法ifPresent(),它允許鏈接可能不返回值的函數:
findCustomerWithSSN(ssn).ifPresent(() -> System.out.println("customer exists!"));
復制代碼
其他相關鏈接
來自Oracle的這篇博文進一步介紹了Optional和它的用途,并將其與其他語言中的類似功能進行了比較 - Tired of Null Pointer Exceptions
總結
以上是生活随笔為你收集整理的java optional 用法_Java 8中的Optional: 如何正确使用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java getmethod类_Java
- 下一篇: java美元兑换,(Java实现) 美元