[英]can i combine java8 (stream, lambda) and guava?
在处理转换时(例如:将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接口以返回年龄的转换器。
最近,我偶然发现java8和guava可以结合使用,因此代码可以是:
Lists2.transform(people, p->p.getAge());
这段代码遵循并运行正常,没有任何错误,这让我感到困惑。 方法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>
都是兼容的。
如果您有一个分配给变量或通过参数传递的函数,那么很容易通过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
具有Java 8 Function
对象,并且需要将其传递给一些Guava代码,则只需使用fn::apply
。 如果您在变量pred
包含Java 8 Predicate
,则在将其传递到Guava代码时使用pred::test
。 类似的方法引用可用于其他功能接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.