orelse_可选的orElse vs orElseGet
orelse
Java 8引入了一個很棒的Optional概念,我們在博客Java 8 Optional中進行了研究 。
因此,為了簡要說明一下,Optional用于表示Optional對象或空值,而不是null引用。 這將有助于避免在我們嘗試對空引用對象執(zhí)行某些操作時發(fā)生空指針異常。
為了從可選對象訪問值 ,很少有諸如get,orELse,orElseGet之類的方法。每當(dāng)我們查看orElse與orElseGet方法時,我們總是會感到困惑。 有什么區(qū)別以及何時使用哪種方法?
當(dāng)我們概述這些方法時,我們認為可以使用orElse(functionCall())代替orElseGet(Class :: functionDef),它將獲得相同的結(jié)果。 那么為什么需要創(chuàng)建兩種不同的方法呢? 直截了當(dāng)?shù)拇鸢甘切袨榇嬖诓町?#xff0c;并且在表現(xiàn)情況下它們會產(chǎn)生巨大差異。
讓我們在此博客中詳細查看其每個行為。
orElse與orElseGet的語法
OrElse方法采用一個參數(shù),如果可選參數(shù)沒有值,則將返回該參數(shù)。
OrElseGet方法需要一個函數(shù),如果可選選項沒有值,則該函數(shù)將被執(zhí)行以返回值。
這表明orElse方法需要一個值,而orElseGet方法需要提供者的功能。
如果我們將函數(shù)傳遞給orElse方法,它將始終在執(zhí)行語句之前執(zhí)行以適合語法。 但是,在orElseGet方法的情況下,我們無法傳遞值,并且僅當(dāng)可選參數(shù)沒有值時才執(zhí)行該函數(shù)。
區(qū)別:orElse與orElseGet
如果optional為null,我們將使用以下函數(shù)獲取值
public String getFunctionForTest() { System.out.println( "\n ===== function called ===== " ); return "default value" ; }讓我們來看看Optional對象具有空值的情況
public void orElseVSorElseGet() { Optional<String> optional = Optional.ofNullable(null); ?String orElseGetResult = optional.orElseGet( this ::getFunctionForTest); System.out.println( "value in orElseGetResult " + orElseGetResult); ?String orElseResult = optional.orElse( this .getFunctionForTest()); System.out.println( "value in orElseResult " + orElseResult); }輸出:
===== function called ===== value in orElseGetResult default value ===== function called ===== value in orElseResult default value正如我們看到的那樣,該期權(quán)沒有價值,我們需要采取其他形式的價值。 因此,正如預(yù)期的那樣,在兩種情況下都會調(diào)用該函數(shù)。
現(xiàn)在讓我們舉一個例子,我們在可選對象中有值,我們不需要執(zhí)行其他部分
public void orElseVSorElseGet() { Optional<String> optional = Optional.ofNullable( "value found" ); String orElseGetResult = optional.orElseGet( this ::getFunctionForTest); System.out.println( "value in orElseGetResult " + orElseGetResult); ?String orElseResult = optional.orElse( this .getFunctionForTest()); System.out.println( "value in orElseResult " + orElseResult); }輸出:
value in orElseGetResult default value ===== function called ===== value in orElseResult default value我們知道選項對象具有值,因此我們不需要將價值形式取為其他部分。
因此,我們希望不應(yīng)執(zhí)行該功能。 但是,在orElse方法的情況下執(zhí)行了該功能。
在上面的示例中,我們可能沒有注意到性能差異,但是當(dāng)我們有復(fù)雜的過程來采用默認值時,它將影響性能。 您可以考慮需要數(shù)據(jù)庫或網(wǎng)絡(luò)調(diào)用以獲取默認值的示例,即使您有值,它也會變慢。
在這種情況下,最好使用orElseGet方法。
在orElse的情況下,即使存在值,也將計算其他部分。 如果我們有默認的靜態(tài)值,那么orElse是一個不錯的選擇。 如果您需要默認值的計算邏輯,則應(yīng)使用orElseGet。
快速閱讀
- 可選的OrElse方法采用參數(shù)
- 可選中的OrElseGet方法需要供應(yīng)商函數(shù)
- 在orElse方法的情況下,即使存在值,也要計算其他部分
- 如果是orElseGet方法,則只有在Optional對象為空時才計算else部分
- 對于固定值或應(yīng)使用Else方法
- 如果需要在運行時計算值,則應(yīng)使用orElseGet
相關(guān)話題
- Java 8可選細節(jié)
- Java 8功能
- Lambda表達式Java 8
翻譯自: https://www.javacodegeeks.com/2020/07/optional-orelse-vs-orelseget.html
orelse
總結(jié)
以上是生活随笔為你收集整理的orelse_可选的orElse vs orElseGet的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓桌面修改器(安卓桌面修改)
- 下一篇: 公章停用备案怎么办理(公章停用备案)