java - 我可以结合java8(流,lambda)和 Guava 吗?

标签 java lambda guava java-stream

在处理转换时(例如:将 List<People> people 转换为 List<Integer> ages ,其中 People 是包含属性 age 的类),通常有两种方法(对我来说):

  1. 使用java8:

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

  2. 或用户 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/

相关文章:

java - ServletContext 类型的 getContextPath() 方法未定义

AMD 64 位平台上的 java.lang.UnsatisfiedLinkError : C:\Program Files\Java\jdk1. 7.0_09\jre\bin\jmtp.dll : Can't load IA 32-bit . dll

c++ - 在 lambda 中捕获命名空间变量

java - 方法引用和 lambda 之间的区别

java - 如何将具有列表属性的对象列表转换为一个包含所有列表属性项的列表

java - 如何使一个有弹性的物体从另一个物体上弹得更低?

java - 在多线程应用程序中使用 JNI 的正确方法

Jinja2 中的 Python lambda

java - 将 ListIterator 限制为前 N 个元素(优化)

grails - spring-security-rest 和 guava 之间的间接 jar 冲突导致 NoSuchMethod 错误