繁体   English   中英

我可以结合使用Java8(流,lambda)和番石榴吗?

[英]can i combine java8 (stream, lambda) and guava?

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

  1. 使用java8:

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM