首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能结合java8 (流,兰达)和番石榴吗?

我能结合java8 (流,兰达)和番石榴吗?
EN

Stack Overflow用户
提问于 2016-03-29 10:32:11
回答 2查看 1.4K关注 0票数 0

在处理转换(例如:将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是实现函数接口以返回年龄的转换器。

最近,我偶然发现可以组合java8和番石榴,因此代码可以是:

代码语言:javascript
复制
Lists2.transform(people, p->p.getAge());

这段代码符合并运行OK,没有任何错误,这让我感到困惑。方法Lists2.transform()要求第二个args是接口com.google.common.base.Function的实现,而java8 lambda实际上是接口java.util.function.Function的实现。

我不明白为什么这会工作,因为他们是两个不同的接口,不同的包。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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>都是兼容的。

票数 8
EN

Stack Overflow用户

发布于 2016-03-30 11:42:02

如果您有一个分配给变量或通过参数传递的函数,那么很容易通过Java-8方法引用来调整它们:

代码语言:javascript
复制
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。类似的方法参考可用于其他功能接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36281784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档