2017-08-30 93 views
0

我將使用java 8和他的所有能力來遷移我的代碼。Java 8使用Lambda/Method參考動態

我想動態地使用lambda表達式或方法引用。

例如,我想通過動態方法調用作爲函數參數,並在lambda後使用它。

public <T> List<?> getDynamic(List<T> objects, ?????? myFilter, ??????? myMapper) { 
    objects.stream() 
     .filter(myFilter) 
     .map(myMapper) 
     .collect(Collectors.toList()); 
} 

getDynamic(customerList, Customer::isEnabled, Customer::getCustomerId); 
getDynamic(customerList, c -> c.isEnabled(), c -> getCustomerId()); 

有沒有辦法做到這一點或喜歡任何更換請嗎?

感謝

---------編輯1 ---------

好感謝的解決方案。

但我忘了1例。我也需要使方法名稱動態。

public <T> List<?> getDynamic(List<T> objects, String myMethodSimpleMapper) { 
    objects.stream() 
     .map(T::myMethodSimpleMapper) <------ HOW ? 
     .collect(Collectors.toList()); 
} 

getDynamic(customerList, "getCustomerId"); 

我具有存儲在類或枚舉(描述符)的一些性質,我需要使用它們來操縱automaticaly僅使用此特性(字符串)的數據。 有些情況很簡單,我有屬性名稱(我也許可以推斷出相關的getter)。

是否有可能使用lambdas或mathod引用?

+0

'謂詞 myFilter','Function <?超級T,?> myMapper'。 –

+0

是否有一個原因需要將該方法作爲字符串傳遞? – kewne

+0

是的,這是爲了描述我的界面的一些常規類。 所以我使用「描述符」就像在我的表格和表格中使用哪些字段,可見,可編輯等等。 我發現得到的唯一方法是使用字段名稱作爲我的DTO字段的鍵來管理。 – JamesPatageule

回答

1

解決這個問題的好方法是看看filtermap接受哪些參數。

enter image description here

我們看到filter想要一個Predicate<? super T>map想要一個Function<? super T, ? extends R>

現在我們只需要弄清楚R是什麼。

既然您想讓您的方法返回List<?>,我們需要將結果映射到?。所以R?。所以`mapper should be函數, which is just函數`的類型。

這是你的方法:

public <T> List<?> getDynamic(List<T> objects, Predicate<? super T> myFilter, Function<? super T, ?> myMapper) { 
    return objects.stream() 
      .filter(myFilter) 
      .map(myMapper) 
      .collect(Collectors.toList()); 
} 

不過,我覺得返回List<?>不是非常有用。我建議你添加另一個通用參數R並返回一個List<R>它會更有用。這只是我個人的看法,但請隨時不要這樣做。

public <T, R> List<R> getDynamic(List<T> objects, Predicate<? super T> myFilter, Function<? super T, ? extends R> myMapper) { 
    return objects.stream() 
      .filter(myFilter) 
      .map(myMapper) 
      .collect(Collectors.toList()); 
}