我可以结合java8(流,lambda)和番石榴?

Lai*_*uan 0 java lambda guava java-stream

在处理转换时(例如:transform List<People> peopleto List<Integer> ages,where People是包含属性的类age),通常有两种方法(对我而言):

  1. 使用java8:

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

  2. 或用户guava2:

    Lists2.transform(people, People2AgeTransformer.INSTANCE);其中People2AgeTransformer是一个变换器,它实现了Function接口以返回年龄.

最近,我偶然发现java8和guava可以合并,因此代码可以是:

Lists2.transform(people, p->p.getAge());
Run Code Online (Sandbox Code Playgroud)

这段代码符合并运行没有任何错误,这让我感到困惑.该方法Lists2.transform()要求第二个args是接口的实现com.google.common.base.Function,而java8 lambda实际上是接口的实现java.util.function.Function.(好吧,它们都声明了一个B apply(A input)将A转换为B 的方法.)

我不明白为什么这会起作用,因为它们是不同包的两个不同界面.

ass*_*ias 8

java8 lambda实际上是接口的实现 java.util.function.Function

不,这不对.p -> p.getAge()没有预定义类型 - 它的类型是在编译时推断的,具体取决于调用它的上下文.任何具有int/Integer getAge(Person p)方法的功能接口都可以使用.

因此,无论java.util.Function<Person, Integer>com.google.common.base.Function<Person, Integer>兼容.