4 回答

TA貢獻(xiàn)1757條經(jīng)驗 獲得超8個贊
通過查看可選的 JavaDoc,可以很容易地回答這個問題:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
lambda 參數(shù)是提供要拋出的異常的提供者。

TA貢獻(xiàn)1712條經(jīng)驗 獲得超3個贊
orElseThrow
Optional
是具有以下簽名的類的方法:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
這意味著您傳遞的 lambda 表達(dá)式必須符合Supplier<? extends X>
函數(shù)接口。函數(shù)式接口有一個方法,不接受參數(shù)并返回:Supplier<T>
的實例。T
T get()
您的 lambda 表達(dá)式 - () -> new EmployeeNotFoundException(id)
- 與此函數(shù)式接口匹配。
該函數(shù)接口的get()
方法用于創(chuàng)建當(dāng) 為空時將拋出Throwable
的實例。orElseThrow()
Optional

TA貢獻(xiàn)1772條經(jīng)驗 獲得超8個贊
我還沒有測試過,但我相信,為了避免必須處理一般性Throwable(通過在方法簽名中聲明它或在封閉方法中捕獲它),您需要提供 aSupplier<RuntimeException>或類似的比RuntimeException. 例如:
Employee employee = repository.findById(id).orElseThrow(
new Supplier<EmployeeNotFoundException>() {
@Override
public EmployeeNotFoundException get() {
return new EmployeeNotFoundException(id);
}
}
);
由于EmployeeNotFoundException是一個RuntimeException未經(jīng)檢查的異常,因此編譯器不會關(guān)心您是否處理異常。
您已經(jīng)正確閱讀了文檔,至少部分正確:我們傳遞給的orElseThrow是 a Supplier,所以這是 lambda 實現(xiàn)的接口,也是我們需要實現(xiàn)的接口,無論我們傳遞方法引用、lambda 還是像您中那樣case,一個用 實例化的對象new。Supplier是一個采用一種類型參數(shù)的通用接口。該文檔還告訴我們orElseThrow需要一個Supplier<? extends X>where X extends Throwable,即X是 的子類型Throwable。所以傳遞 aSupplier<Throwable>并不是不正確的,但正如你所經(jīng)歷的,它在其他地方給你帶來了一些麻煩。我們可以輸入任何子類型Throwable來代替。輸入RuntimeExceptionor 可以EmployeeNotFoundException讓我們擺脫麻煩。
不過,當(dāng) lambda 工作正常時,我不知道為什么你要這么啰嗦。

TA貢獻(xiàn)1821條經(jīng)驗 獲得超5個贊
Optional::orElseThrow
接受 a?Supplier
,這Supplier
用于獲取一個實例,如果該實例具有下面的值Exception
,則該實例將被拋出。請參閱實現(xiàn):Optional
null
Optional::orElseThrow
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
? ? if (this.value != null) {
? ? ? ? return this.value;
? ? } else {
? ? ? ? throw (Throwable)exceptionSupplier.get();
? ? }
}
它只是檢查值是否存在,如果不存在,它會從中獲取 Execption 實例Supplier并拋出它。
和表達(dá):
() -> new EmployeeNotFoundException(id)
符合方法 - where extendsSupplier的預(yù)期。它甚至可以被提取為單獨的變量:Optional::orElseThrowSupplier<? extends X> exceptionSupplierXThrowable
Supplier<EmployeeNotFoundException> execptionSupplier = () -> new EmployeeNotFoundException(id);
Employee employee = repository.findById(id).orElseThrow(execptionSupplier);
添加回答
舉報