我可以把java8(stream,lambda)和番石榴结合起来吗?

我可以把java8(stream,lambda)和番石榴结合起来吗?,java,lambda,guava,java-stream,Java,Lambda,Guava,Java Stream,在处理transformationse.g:将List people转换为List age时,其中people是一个包含属性age的类,通常有两种方法: 使用java8: people.stream.mapp->p.getAge.collecttoList 或用户guava2: Lists2.transformpeople,People2AgeTransformer.INSTANCE;其中People2GetTransformer是一个实现函数接口以返回年龄的转换器 最近,我意外地发现java8

在处理transformationse.g:将List people转换为List age时,其中people是一个包含属性age的类,通常有两种方法:

使用java8:

people.stream.mapp->p.getAge.collecttoList

或用户guava2:

Lists2.transformpeople,People2AgeTransformer.INSTANCE;其中People2GetTransformer是一个实现函数接口以返回年龄的转换器

最近,我意外地发现java8和番石榴可以组合在一起,因此代码可以是:

Lists2.transform(people, p->p.getAge());
这段代码符合要求,运行正常,没有任何错误,这让我感到困惑。 方法Lists2.transform要求第二个参数是接口com.google.common.base.Function的实现,而java8 lambda实际上是接口java.util.Function.Function.Well的实现,它们都声明了方法B applyA input来将a转换为B

我不明白为什么这会起作用,因为它们是不同包的两个不同接口

java8 lambda实际上是接口java.util.function.function的实现

不,不是。p->p.getAge没有预定义的类型-它的类型在编译时根据调用它的上下文进行推断。任何具有int/Integer getAgePerson p方法的函数接口都可以工作


因此,java.util.Function和com.google.common.base.Function都是兼容的。

如果将函数分配给变量或通过参数传递,则通过java-8方法引用很容易调整它们:

java.util.function.Function<Person, Integer> javaFunction = p -> p.getAge();
com.google.common.base.Function<Person, Integer> guavaFunction = javaFunction::apply;
java.util.function.Function<Person, Integer> javaFunction2 = guavaFunction::apply;
所以,如果变量fn中已经有Java8函数对象,并且需要将其传递到一些Guava代码中,只需使用fn::apply。如果变量pred中有Java8谓词,那么在将其传递到Guava代码中时使用pred::test。类似的方法引用可用于其他功能接口