在处理转换(例如:将List<People> people转换为List<Integer> ages,其中People是包含属性age的类)时,通常有两种方法(对我来说):
people.stream().map(p -> p.getAge()).collect(toList());Lists2.transform(people, People2AgeTransformer.INSTANCE);,其中People2AgeTransformer是实现函数接口以返回年龄的转换器。最近,我偶然发现可以组合java8和番石榴,因此代码可以是:
Lists2.transform(people, p->p.getAge());这段代码符合并运行OK,没有任何错误,这让我感到困惑。方法Lists2.transform()要求第二个args是接口com.google.common.base.Function的实现,而java8 lambda实际上是接口java.util.function.Function的实现。
我不明白为什么这会工作,因为他们是两个不同的接口,不同的包。
发布于 2016-03-29 10:46:26
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>都是兼容的。
发布于 2016-03-30 11:42:02
如果您有一个分配给变量或通过参数传递的函数,那么很容易通过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;因此,如果您已经在变量Function中拥有Java8 fn对象,并且需要将其传递到某些番石榴代码中,那么只需使用fn::apply即可。如果变量Predicate中有Java8 pred,则在将其传递给番石榴代码时使用pred::test。类似的方法参考可用于其他功能接口。
https://stackoverflow.com/questions/36281784
复制相似问题