7 回答

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而不是已檢查的異常才能脫離供應商。

TA貢獻1824條經驗 獲得超5個贊
那是因為里面的代碼orElse()
總是會被評估。換句話說,即使您指定非空,它也會被執行Optional
,所以這就是Exception
拋出的原因。
如果您查看Java 可選 – orElse() 與 orElseGet()orElse()
文章的部分,您可以在他們的示例中看到這一點,其中顯示:
我們可以很容易地推斷出 orElse() 的參數即使在具有非空 Optional 的情況下也會被評估。

TA貢獻1820條經驗 獲得超9個贊
我真的很想知道為什么這段代碼是以這種方式編寫的。似乎它需要觸發一個異常,并在可選中添加一個顯式的 NULL 值。
正如已經說過的,當使用orElse()而不是orElseGet()方法時,無論 T 的值如何(例如Optional<T>)都會被評估。
我會使用更好的時尚和理解:
String value = "notnull"; // could be null
Optional.ofNullable(value)
.orElseThrow(MyException::new);
如果值為 NULL,則會觸發異常。
注意:您可以使用方法引用來調用異常

TA貢獻2039條經驗 獲得超8個贊
你寫的是這樣的:
String t = null;
String myException = Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"));
Optional.ofNullable("notnull").orElse(myException);
在您知道您的值是否為空之前,部分已被評估。如果您想要評估,請考慮orElse方法。Optional"Lazy"orElseGet

TA貢獻1804條經驗 獲得超8個贊
關于Optional ,您應該注意以下幾點:
如果已知被包裝的值是否為空,請使用Optional.of()或Optional.empty()。如果不確定(例如值是從其他地方獲得的變量),請使用Optional.ofNullable()
Optional.orElse()和Optional.orElseGet()之間有一個重要的區別。
orElse
接受一個已經計算出的值,如果提供了一個表達式,它會立即執行并立即計算。這發生在有問題的代碼中。因此,這個 else 變體應該用于已經可用的值或原語。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());

TA貢獻1859條經驗 獲得超6個贊
問題是按執行順序。它嘗試計算 .orElse(...) 的值并在 .orElseThrow 上拋出 MyException。
換句話說,如果 t 不為空,執行流程如下:
1) 計算值
Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))
2) 使用 (1) 中的值
Optional.ofNullable("notnull").orElse(...)

TA貢獻1833條經驗 獲得超4個贊
結果是預料之中的,因為在 Java 中,在調用帶有參數的方法之前,JVM 之前所做的事情是評估參數值。
那就是調用的參數值.orElse()
:
Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))
由于t
引用null
,因此預計會拋出異常。
添加回答
舉報