這個問題在這里已經有了答案: `Optional.orElse()` 和 `Optional.orElseGet()` 之間的區別 (8 個回答) 拋出例外的哪一部分是昂貴的? (6 個回答) 4 天前關閉。
這個帖子4天前編輯過提交審核,重新打開帖子失敗:
原始關閉原因未解決
為什么我們必須這樣寫?創建例外實體比創建供應商實體更昂貴嗎?
var value = getOptional().orElseThrow(NullPointerException::new);
// instead of
var value = getOptional().orElseThrow(new NullPointerException());
uj5u.com熱心網友回復:
.orElseThrow(NullPointerException::new)相當于() -> new NullPointerException()。
這是一個只有在 Optional 為空時才會呼叫的函式
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get(); // Only invoke on this path
}
}
代碼
最好的原因.orElseThrow(new NullPointerException())是因為性能。當你傳遞一個函式時,如果你真的需要拋出它,你只會按需創建一個例外。
相對而言,創建大多數例外的成本很高*。建構式幾乎總是會創建一個堆疊跟蹤,并且構建堆疊跟蹤相對較慢*。收集堆疊跟蹤是在Throwable的建構式中完成的。
public Throwable() {
fillInStackTrace();
}
有一個變體建構式不會收集堆疊跟蹤,但很少使用。
他們本可以提供第二個簽名以允許人們在它們之間進行選擇,但是您建議的簽名很可能會經常被濫用,從而導致性能下降。
* “貴”和“慢”是相對的術語。現代 CPU速度很快。雖然它可能比大多數正常操作慢得多,但它通常不會成為大多數應用程式或類似應用程式的瓶頸。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362403.html
