亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Java 可選和 orElse

Java 可選和 orElse

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

7 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

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


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


String t = null;

Optional.ofNullable("notnull")

    .orElseGet(

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

    );

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


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

TA貢獻1824條經驗 獲得超5個贊

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

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

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


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

TA貢獻1820條經驗 獲得超9個贊

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


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


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


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

Optional.ofNullable(value)

    .orElseThrow(MyException::new);

如果值為 NULL,則會觸發異常。


注意:您可以使用方法引用來調用異常


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

TA貢獻2039條經驗 獲得超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條經驗 獲得超8個贊

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

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

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

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

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

// 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條經驗 獲得超6個贊

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

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

1) 計算值

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

2) 使用 (1) 中的值

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


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

TA貢獻1833條經驗 獲得超4個贊

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

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

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


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號