Lai*_*uan 0 java lambda guava java-stream
在处理转换时(例如: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 的方法.)
我不明白为什么这会起作用,因为它们是不同包的两个不同界面.
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>
兼容.
归档时间: |
|
查看次数: |
1311 次 |
最近记录: |