在处理转换时(例如:transform List<People> people
to List<Integer> ages
,where People
是包含属性的类age
),通常有两种方法(对我而言):
使用java8:
people.stream().map(p -> p.getAge()).collect(toList())
;
或用户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 的方法.)
我不明白为什么这会起作用,因为它们是不同包的两个不同界面.