3 回答

TA貢獻1840條經驗 獲得超5個贊
如果我了解您要查找的內容,我會重載end()并擺脫最后一個函數組合:
public Function<InType, CurrentType> end() {
return this.getter;
}
進一步思考,我認為Context可以消除類的第三個類型參數,因為僅在方法級別需要中間類型。檢查這個:
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貢獻1864條經驗 獲得超6個贊
您不能在 Java 中定義具有相同名稱和不同返回類型的方法。您的方法可能會返回類似的東西Wrapped<T>
,而您想要返回T
。一般來說,我可能會建議為*andEnd(...)
您的每種方法設置類似的東西。管道也是如此pipeAndEnd(...)
,然后以終端操作結束。這可能會變得乏味,因此如果您有很多方法,您可能想研究一些代碼生成。
另一方面,您似乎正在實現自己的 Stream API 版本。除非您這樣做是出于教育目的,否則使用現有且經過良好測試/記錄的代碼(尤其是標準 jdk 的代碼部分)幾乎總是比重新實現您自己的相同版本更好。

TA貢獻1757條經驗 獲得超8個贊
我遇到的主要問題是任何pipe步驟都可能是終端操作。正如每個答案和主要帖子下面的討論中所述:在java中不可能使用兩次具有相同名稱的函數并且一個是終端操作。
我猛烈抨擊這個問題并嘗試了多種方法,但每種方法都不起作用。那是當我意識到我在做的事情本質上與 Javas Stream-API 相同:你有一個起源(源),做一些花哨的東西(管道)然后結束(收集)。如果我們對我的問題應用相同的方案,則不需要進行pipe終端操作,我們只需要另一個操作(例如end)作為終點。由于我對何時可能結束(當前類型必須與另一種類型匹配)有一些擴展要求,因此我end只允許一個上下文特定的函數來實現,該函數只有一個可用的合理實現(很難解釋)。這是當前實現的示例(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,充當終端操作員,ConstructorParameter::bind如果當前類型與預期類型不匹配,則會抱怨類型不匹配。
參見這里的to部分,這里的實現ConstructorParameter以及它是如何定義的。
添加回答
舉報