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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何處理一個(gè)每一步都可以是終端操作的流暢界面?

如何處理一個(gè)每一步都可以是終端操作的流暢界面?

ITMISS 2022-11-10 16:39:41
我正在構(gòu)建一個(gè)大致像這樣工作的流暢 API(假設(shè)存在一個(gè)返回 a 的Person帶有 getter的類):getIdLongString result = context.map(Person::getId)     .pipe(Object::toString)     .pipe(String::toUpperCase)     .end(Function.identity())如您所見,只有.end-function 充當(dāng)終端運(yùn)算符。這使上述 API 的整體使用.end(Function.identity())變得混亂,因?yàn)榧词骨懊娴?pipe-call 已經(jīng)具有正確的類型,我也經(jīng)常不得不以 -call 結(jié)束。有什么方法可以制作一個(gè) fluent-API,使其一部分既是終端操作員又是“橋接操作員”?我只是不想用專門的 pipe變體pipeTo(例如,只接受 aFunction<CurrentType, ExpectedType>和內(nèi)部調(diào)用的管道.end)來模擬所述行為,因?yàn)樗仁褂脩艨紤] API 的一個(gè)非常特定的部分,這對(duì)我來說似乎是不必要的。編輯:根據(jù)要求簡(jiǎn)化上下文實(shí)現(xiàn):class Context<InType, CurrentType, TargetType> {    private final Function<InType, CurrentType> getter;    public Context(Function<InType, CurrentType> getter) {        this.getter = getter;    }    public <IntermediateType> Context<InType, IntermediateType, TargetType>    pipe(Function<CurrentType, IntermediateType> mapper) {        return new Context<>(getter.andThen(mapper));    }    public Function<InType, TargetType> end(Function<CurrentType, TargetType> mapper) {        return getter.andThen(mapper);    }}//usageFunction<Person, String> mapper = new Context<Person, Long, String>(Person::getId)    .pipe(Object::toString)    .pipe(String::toUpperCase)    .end(Function.identity());mapper.apply(new Person(...))
查看完整描述

3 回答

?
慕斯709654

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

如果我了解您要查找的內(nèi)容,我會(huì)重載end()并擺脫最后一個(gè)函數(shù)組合:


public Function<InType, CurrentType> end() {

    return this.getter;

}

進(jìn)一步思考,我認(rèn)為Context可以消除類的第三個(gè)類型參數(shù),因?yàn)閮H在方法級(jí)別需要中間類型。檢查這個(gè):


class OtherContext<I, O> {


    private final Function<I, O> getter;


    public OtherContext(Function<I, O> getter) {

        this.getter = getter;

    }


    public <T> OtherContext<I, T> pipe(Function<O, T> mapper) {


        return new OtherContext<I, T>(getter.andThen(mapper));

    }


    public <T> Function<I, T> end(Function<O, T> mapper) {

        return getter.andThen(mapper);

    }


    public Function<I, O> end() {

        return getter;

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-11-10
?
慕尼黑的夜晚無繁華

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊

您不能在 Java 中定義具有相同名稱和不同返回類型的方法。您的方法可能會(huì)返回類似的東西Wrapped<T>,而您想要返回T。一般來說,我可能會(huì)建議為*andEnd(...)您的每種方法設(shè)置類似的東西。管道也是如此pipeAndEnd(...),然后以終端操作結(jié)束。這可能會(huì)變得乏味,因此如果您有很多方法,您可能想研究一些代碼生成。

另一方面,您似乎正在實(shí)現(xiàn)自己的 Stream API 版本。除非您這樣做是出于教育目的,否則使用現(xiàn)有且經(jīng)過良好測(cè)試/記錄的代碼(尤其是標(biāo)準(zhǔn) jdk 的代碼部分)幾乎總是比重新實(shí)現(xiàn)您自己的相同版本更好。


查看完整回答
反對(duì) 回復(fù) 2022-11-10
?
陪伴而非守候

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊

我遇到的主要問題是任何pipe步驟都可能是終端操作。正如每個(gè)答案和主要帖子下面的討論中所述:在java中不可能使用兩次具有相同名稱的函數(shù)并且一個(gè)是終端操作。


我猛烈抨擊這個(gè)問題并嘗試了多種方法,但每種方法都不起作用。那是當(dāng)我意識(shí)到我在做的事情本質(zhì)上與 Javas Stream-API 相同:你有一個(gè)起源(源),做一些花哨的東西(管道)然后結(jié)束(收集)。如果我們對(duì)我的問題應(yīng)用相同的方案,則不需要進(jìn)行pipe終端操作,我們只需要另一個(gè)操作(例如end)作為終點(diǎn)。由于我對(duì)何時(shí)可能結(jié)束(當(dāng)前類型必須與另一種類型匹配)有一些擴(kuò)展要求,因此我end只允許一個(gè)上下文特定的函數(shù)來實(shí)現(xiàn),該函數(shù)只有一個(gè)可用的合理實(shí)現(xiàn)(很難解釋)。這是當(dāng)前實(shí)現(xiàn)的示例(pipe已重命名為和map):endto


Mapper<Person, PersonDTO> mapper = Datus.forTypes(Person.class, PersonDTO.class).immutable(PersonDTO::new)

    .from(Person::getFirstName).to(ConstructorParameter::bind)

    .from(Person::getLastName)

        .given(Objects::nonNull, ln -> ln.toUpperCase()).orElse("fallback")

        .to(ConstructorParameter::bind)

    .build();

如您所見.to,充當(dāng)終端操作員,ConstructorParameter::bind如果當(dāng)前類型與預(yù)期類型不匹配,則會(huì)抱怨類型不匹配。


參見這里的to部分,這里的實(shí)現(xiàn)ConstructorParameter以及它是如何定義的。


查看完整回答
反對(duì) 回復(fù) 2022-11-10
  • 3 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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