第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 可選和 orElse

Java 可選和 orElse

qq_笑_17 2023-06-21 16:17:44
我是 Java 選項的新手,但我看到另一個開發(fā)人員編寫的代碼,但我不明白:String t = null;Optional.ofNullable("notnull")    .orElse(        Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))    );為什么這段代碼會拋出異常?為什么它甚至會轉到“orElse”分支?這是因為一些奇怪的執(zhí)行順序嗎?那么在評估 orElse 分支之前沒有設置第一個可選值?
查看完整描述

7 回答

?
慕田峪7331174

TA貢獻1828條經(jīng)驗 獲得超13個贊

永遠不會調(diào)用流orElse,但會執(zhí)行方法本身。這意味著方法參數(shù)也傳遞給它。Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))因此無論傳遞給第一次調(diào)用的值如何,都會調(diào)用該部分Optional.ofNullable。


如果你不希望這種情況發(fā)生,你需要傳遞Supplier這樣的信息:


String t = null;

Optional.ofNullable("notnull")

    .orElseGet(

        () -> Optional.ofNullable(t).orElseThrow(() -> new RuntimeException("MyException"))

    );

orElseGet只有在調(diào)用流時才會調(diào)用供應商。請注意,您需要一個RuntimeException而不是已檢查的異常才能脫離供應商。


查看完整回答
反對 回復 2023-06-21
?
滄海一幻覺

TA貢獻1824條經(jīng)驗 獲得超5個贊

那是因為里面的代碼orElse()總是會被評估。換句話說,即使您指定非空,它也會被執(zhí)行Optional,所以這就是Exception拋出的原因。

如果您查看Java 可選 – orElse() 與 orElseGet()orElse()文章的部分,您可以在他們的示例中看到這一點,其中顯示:

我們可以很容易地推斷出 orElse() 的參數(shù)即使在具有非空 Optional 的情況下也會被評估。


查看完整回答
反對 回復 2023-06-21
?
慕妹3146593

TA貢獻1820條經(jīng)驗 獲得超9個贊

我真的很想知道為什么這段代碼是以這種方式編寫的。似乎它需要觸發(fā)一個異常,并在可選中添加一個顯式的 NULL 值。


正如已經(jīng)說過的,當使用orElse()而不是orElseGet()方法時,無論 T 的值如何(例如Optional<T>)都會被評估。


我會使用更好的時尚和理解:


String value = "notnull"; // could be null

Optional.ofNullable(value)

    .orElseThrow(MyException::new);

如果值為 NULL,則會觸發(fā)異常。


注意:您可以使用方法引用來調(diào)用異常


查看完整回答
反對 回復 2023-06-21
?
largeQ

TA貢獻2039條經(jīng)驗 獲得超8個贊

你寫的是這樣的:


String t = null;

String myException = Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"));

Optional.ofNullable("notnull").orElse(myException);

在您知道您的值是否為空之前,部分已被評估。如果您想要評估,請考慮orElse方法。Optional"Lazy"orElseGet


查看完整回答
反對 回復 2023-06-21
?
胡說叔叔

TA貢獻1804條經(jīng)驗 獲得超8個贊

關于Optional ,您應該注意以下幾點:

  1. 如果已知被包裝的值是否為空,請使用Optional.of()或Optional.empty()。如果不確定(例如值是從其他地方獲得的變量),請使用Optional.ofNullable()

  2. Optional.orElse()和Optional.orElseGet()之間有一個重要的區(qū)別。

    1. orElse接受一個已經(jīng)計算出的值,如果提供了一個表達式,它會立即執(zhí)行并立即計算。這發(fā)生在有問題的代碼中。因此,這個 else 變體應該用于已經(jīng)可用的值或原語。

    2. orElseGet接受一個供應商函數(shù),該函數(shù)僅在評估可選鏈并請求替代值時運行。當替代值的生成或計算成本昂貴時應使用此方法。

// Fine

Optional<String> name = Optional.of(someValue).orElse("defaultName");


// But this:

Optional<String> name = Optional.of(someValue).orElse(db.queryName());


// Is better written as following, as it saves you from an expensive operation

Optional<String> name = Optional.of(someValue).orElseGet(() -> db.queryName());


查看完整回答
反對 回復 2023-06-21
?
慕絲7291255

TA貢獻1859條經(jīng)驗 獲得超6個贊

問題是按執(zhí)行順序。它嘗試計算 .orElse(...) 的值并在 .orElseThrow 上拋出 MyException。

換句話說,如果 t 不為空,執(zhí)行流程如下:

1) 計算值

Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))

2) 使用 (1) 中的值

Optional.ofNullable("notnull").orElse(...)


查看完整回答
反對 回復 2023-06-21
?
瀟瀟雨雨

TA貢獻1833條經(jīng)驗 獲得超4個贊

結果是預料之中的,因為在 Java 中,在調(diào)用帶有參數(shù)的方法之前,JVM 之前所做的事情是評估參數(shù)值。
那就是調(diào)用的參數(shù)值.orElse()

Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))

由于t引用null,因此預計會拋出異常。


查看完整回答
反對 回復 2023-06-21
  • 7 回答
  • 0 關注
  • 320 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號