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

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

orElseThrow 中的 lambda 表達(dá)式替換了什么?

orElseThrow 中的 lambda 表達(dá)式替換了什么?

慕桂英546537 2023-09-20 14:50:51
讓我們看一些簡單的示例代碼:Employee employee = repository.findById(id).orElseThrow(() -> new EmployeeNotFoundException(id));根據(jù)我的理解,lambda用于創(chuàng)建函數(shù)式接口的替代(只有1個方法),空括號意味著該方法沒有參數(shù)。但是 orElseThrow 中調(diào)用了什么方法需要 lambda 呢?我認(rèn)為它要么是一個Optional,要么是一個Exception。所以我的問題是:如果沒有 lambda 調(diào)用,這會是什么樣子?員工類別:class Employee {    private Long id;    private String name;    private String role;    Employee() {}    Employee(String name, String role) {        this.name = name;        this.role = role;    }}和異常類:class EmployeeNotFoundException extends RuntimeException {    EmployeeNotFoundException(Long id) {        super("Could not find employee " + id);    }}編輯:我對如何為 lambda 表達(dá)式編寫有效的、可編譯的替換感興趣。現(xiàn)在我在        Employee employee = repository.findById(id).orElseThrow(            new Supplier<Throwable>() {                @Override                public Throwable get() {                    return new EmployeeNotFoundException(id);                }            }        )但這是不對的,因為現(xiàn)在我需要將異常添加到方法簽名中,而使用 lambda 時情況并非如此。它表明我不知道如何手動實現(xiàn)供應(yīng)商類,而不僅僅是使用 lambda 跳過所有這些
查看完整描述

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ù)是提供要拋出的異常的提供者。


查看完整回答
反對 回復(fù) 2023-09-20
?
交互式愛情

TA貢獻(xiàn)1712條經(jīng)驗 獲得超3個贊

orElseThrowOptional是具有以下簽名的類的方法:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

這意味著您傳遞的 lambda 表達(dá)式必須符合Supplier<? extends X>函數(shù)接口。函數(shù)式接口有一個方法,不接受參數(shù)并返回:Supplier<T>的實例。TT get()

您的 lambda 表達(dá)式 - () -> new EmployeeNotFoundException(id)- 與此函數(shù)式接口匹配。

該函數(shù)接口的get()方法用于創(chuàng)建當(dāng) 為空時將拋出Throwable的實例。orElseThrow()Optional


查看完整回答
反對 回復(fù) 2023-09-20
?
料青山看我應(yīng)如是

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 工作正常時,我不知道為什么你要這么啰嗦。


查看完整回答
反對 回復(fù) 2023-09-20
?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗 獲得超5個贊

Optional::orElseThrow接受 a?Supplier,這Supplier用于獲取一個實例,如果該實例具有下面的值Exception,則該實例將被拋出。請參閱實現(xiàn):OptionalnullOptional::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);


查看完整回答
反對 回復(fù) 2023-09-20
  • 4 回答
  • 0 關(guān)注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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