Lai*_*uan 0 java lambda guava java-stream
在处理转换时(例如:transform List<People> peopleto 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 次 |
| 最近记录: |