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