3 回答

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;
}
}

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)您自己的相同版本更好。

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以及它是如何定義的。
添加回答
舉報(bào)