首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以将BiFunction引用传递给期望函数接口的方法吗?

可以将BiFunction引用传递给期望函数接口的方法吗?
EN

Stack Overflow用户
提问于 2015-02-05 04:41:16
回答 3查看 11.5K关注 0票数 7

我一直只使用Java 6,现在正在学习Java 8中的新内容。

上面写着:

Java在java.util.function包中定义了几个通用函数接口。其中一个接口BiFunction描述参数类型T和U以及返回类型R的函数。您可以将字符串比较lambda保存在该类型的变量中:

代码语言:javascript
运行
复制
BiFunction<String, String, Integer> comp 
    = (first, second) -> Integer.compare(first.length(), second.length()); 

但是,这并不能帮助您进行排序。没有任何Arrays.sort方法需要BiFunction。如果您以前使用过函数式编程语言,您可能会觉得这很奇怪。但是对于Java程序员来说,这是非常自然的。接口(例如比较器)有特定的用途,而不仅仅是具有给定参数和返回类型的方法。Java 8保留了这种风格。当您想要使用lambda表达式做一些事情时,您仍然希望记住表达式的目的,并为它创建一个特定的函数接口。

然而,当我看到这个线程:如何将lambda分配给Java 8中的变量?

这个问题的答案建议你去做你不能做的事情。

那么,文章中的信息是不正确的,还是我在这里误读了什么?

谢谢!

EN

Stack Overflow用户

发布于 2015-02-05 05:55:52

从这个意义上说,这篇文章是正确的,不能根据BiFunction类型的对象进行排序,但是您总是可以使用Comparator。但是,嘿,他们都可以有相同的身体。例如:

代码语言:javascript
运行
复制
private static void sort(Comparator<String> ls){
        Arrays.sort(someArray, ls);
}

Comparator<String> comp = (String f1, String f2) -> Integer.compare(f1.length(), f2.length());
sort(comp);

BiFunction<String, String, Integer> func = (String f1, String f2) -> Integer.compare(f1.length(), f2.length());
sort((String f1, String f2) -> Integer.compare(f1.length(), f2.length())); //line-4

sort(func) // compiler error

在上面的第4行,您可以传递一个与func完全相同的lambda。但是仍然不能将func传递给sort。java8中的Lambdas是一些FunctionalInterface的实现。函数接口根据其引用类型得到它们的类型。这就是初始化时相同的lambda可以是BiFunction还是Comparator的原因。

但是一旦一个lambda被构造并且它得到了它的类型,那么你就不能改变它。因此,不能将类型为funcBiFunction传递给期望Comparator的排序。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28336350

复制
相关文章

相似问题

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