2016-03-29 53 views
0

當變換處理(例如:變換List<People> peopleList<Integer> ages,其中People是包含一個屬性age類),通常有2種方式(對我來說)這樣做的:我可以結合java8(流,拉姆達)和番石榴嗎?

  1. 使用java8:

    people.stream().map(p -> p.getAge()).collect(toList());

  2. 或用戶guava2:

    Lists2.transform(people, People2AgeTransformer.INSTANCE);其中People2AgeTransformer是實現功能接口返回歲的變壓器。

最近,我accidentlly發現java8和番石榴可以合併,因此代碼可以是:

Lists2.transform(people, p->p.getAge()); 

這段代碼要求,並且運行正常,沒有任何錯誤,這讓我感到困惑。 方法Lists2.transform()需要第二個參數傳遞給是接口com.google.common.base.Function的實現,而java8拉姆達實際上是接口java.util.function.Function的實現。(當然,它們都聲明瞭一個方法來B apply(A input)變換到B.)

我不不明白爲什麼這會起作用,因爲它們是兩種不同包裝的不同界面。

回答

8

的java8拉姆達實際上是接口java.util.function.Function

沒有實施它不是。 p -> p.getAge()沒有預定義類型 - 其編譯時的類型爲,推測爲,具體取決於調用的上下文。任何具有int/Integer getAge(Person p)方法的功能接口都可以工作。

因此java.util.Function<Person, Integer>com.google.common.base.Function<Person, Integer>是兼容的。

+0

Thx很多!猜猜我需要查看java8文檔。 – LaiyuXuan

1

如果你有一個分配給變量或通過參數傳遞的功能,它很容易通過Java-8的方法引用,以適應他們:

java.util.function.Function<Person, Integer> javaFunction = p -> p.getAge(); 
com.google.common.base.Function<Person, Integer> guavaFunction = javaFunction::apply; 
java.util.function.Function<Person, Integer> javaFunction2 = guavaFunction::apply; 

所以,如果你已經在可變fn的Java 8 Function對象,需要將它傳遞給一些Guava代碼,只需使用fn::apply即可。如果在變量pred中有Java 8 Predicate,則在將其傳遞到Guava代碼時使用pred::test。類似的方法引用可以用於其他功能接口。