在处理转换时(例如:将 List<People> people
转换为 List<Integer> ages
,其中 People
是包含属性 age
的类),通常有两种方法(对我来说):
使用java8:
people.stream().map(p -> p.getAge()).collect(toList())
;或用户 guava2:
Lists2.transform(people, People2AgeTransformer.INSTANCE);
其中People2AgeTransformer
是一个实现 Function 接口(interface)以返回年龄的转换器。
最近无意中发现java8和guava可以结合,所以代码可以是:
Lists2.transform(people, p->p.getAge());
这段代码符合要求并且运行正常,没有任何错误,这让我很困惑。
方法Lists2.transform()
要求第二个参数是接口(interface) com.google.common.base.Function
的实现,而java8 lambda实际上是接口(interface)java.util.function.Function
的实现(好吧,他们都声明了一个方法 B apply(A input)
将 A 转换为 B。)
我不明白为什么这会起作用,因为它们是不同包的两个不同接口(interface)。
最佳答案
the java8 lambda is actually the implementation of interface
java.util.function.Function
不,不是。 p -> p.getAge()
没有预定义类型 - 它的类型是在编译时根据调用它的上下文推断的。任何具有 int/Integer getAge(Person p)
的功能接口(interface)方法将起作用。
所以都是java.util.Function<Person, Integer>
和com.google.common.base.Function<Person, Integer>
兼容。
关于java - 我可以结合java8(流,lambda)和 Guava 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36281784/