您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java的Optional能補(bǔ)充所有傳統(tǒng)的if-null-else或if-not-null-else嗎的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Java 添加的java.util.Optional
非常的受歡迎,并為總是不能返回非null值的方法提供了更流暢的代碼。很不幸的是,Optional
已被濫用,一種濫用,甚至已被過度使用。當(dāng)與直接使用相比null
沒有明顯優(yōu)勢時(shí),我偶爾會遇到使用Optional
的代碼。
當(dāng) Optional 與直接檢查 null 相比沒有任何優(yōu)勢,調(diào)用代碼對它剛剛調(diào)用的方法的返回值使用Optional.ofNullable(T)
時(shí),可能會提示一個(gè)危險(xiǎn)信號。如同所有的“危險(xiǎn)信號”,這并不意味著將方法將返回值傳遞個(gè)Optional.ofNullable(T)
(事實(shí)上,傳遞給期望 Optional 的 API 是必要的),但它的這種做法通常是用于不提供實(shí)際值,而不是直接使用返回值并檢查它的是否為 null。
在 Optional 可用之前,用于檢查 null 方法返回的代碼以及對 null 響應(yīng)采取一種方式和對非 null 響應(yīng)采取另一種方式的代碼如下所示)。
/**
* Demonstrates approach to conditional based on {@code null} or
* not {@code null} that is traditional pre-{@link Optional} approach.
*/
public void demonstrateWithoutOptional()
{
final Object returnObject = methodPotentiallyReturningNull();
if (returnObject == null)
{
out.println("The returned Object is null.");
}
else
{
out.println("The returned object is NOT null: " + returnObject);
// code processing non-null return object goes here ...
}
}
對于這個(gè)基本條件,很少需要涉及Optional。下一個(gè)代碼片段代表了我在開發(fā)人員嘗試使用Optional替換顯式空檢測時(shí)偶爾看到的代碼類型:
/**
* Demonstrates using {@link Optional} in exactly the manner {@code null}
* is often used (conditional on whether the returned value is empty or
* not versus on whether the returned value is {@code null} or not).
*/
public void demonstrateOptionalUsedLikeNullUsed()
{
final Optional<Object> optionalReturn
= Optional.ofNullable(methodPotentiallyReturningNull());
if (optionalReturn.isEmpty())
{
out.println("The returned Object is empty.");
}
else
{
out.println("The returned Object is NOT empty: " + optionalReturn);
// code processing non-null return object goes here ...
}
}
此代碼中的范式與傳統(tǒng)的null檢查代碼基本相同,但使用Optional.isEmpty()
執(zhí)行相同的檢查。這種方法不會增加任何可讀性或其他優(yōu)勢,但確實(shí)以額外的對象實(shí)例化和方法調(diào)用為代價(jià)。
上述用法的一個(gè)變體Optional是將其ifPresent(Consumer)
方法與其isEmpty()
方法結(jié)合使用,形成相同的基本邏輯,如果返回值存在則做一件事,如果返回值為空則做另一件事。這在以下代碼中進(jìn)行了演示。
/**
* Demonstrates using {@link Optional} methods {@link Optional#ifPresent(Consumer)}
* and {@link Optional#isEmpty()} in similar manner to traditional condition based
* on {@code null} or not {@code null}.
*/
public void demonstrateOptionalIfPresentAndIsEmpty()
{
final Optional<Object> optionalReturn
= Optional.ofNullable(methodPotentiallyReturningNull());
optionalReturn.ifPresent(
(it) -> out.println("The returned Object is NOT empty: " + it));
if (optionalReturn.isEmpty())
{
out.println("The returned object is empty.");
}
}
這段代碼看起來比直接檢查 的返回值的傳統(tǒng)方法要短一些null,但仍然以額外的對象實(shí)例化為代價(jià),并且需要兩次方法調(diào)用。此外,首先檢查 Optional 是否存在然后立即檢查它是否為空感覺有點(diǎn)奇怪。此外,如果需要執(zhí)行的邏輯比將消息寫到標(biāo)準(zhǔn)輸出更復(fù)雜,這種方法就變得不那么實(shí)用了。
以上就是“Java的Optional能補(bǔ)充所有傳統(tǒng)的if-null-else或if-not-null-else嗎”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。