我一直只使用Java 6,现在正在学习Java 8中的新内容。
上面写着:
Java在java.util.function包中定义了几个通用函数接口。其中一个接口BiFunction描述参数类型T和U以及返回类型R的函数。您可以将字符串比较lambda保存在该类型的变量中:
BiFunction<String, String, Integer> comp
= (first, second) -> Integer.compare(first.length(), second.length()); 但是,这并不能帮助您进行排序。没有任何Arrays.sort方法需要BiFunction。如果您以前使用过函数式编程语言,您可能会觉得这很奇怪。但是对于Java程序员来说,这是非常自然的。接口(例如比较器)有特定的用途,而不仅仅是具有给定参数和返回类型的方法。Java 8保留了这种风格。当您想要使用lambda表达式做一些事情时,您仍然希望记住表达式的目的,并为它创建一个特定的函数接口。
然而,当我看到这个线程:如何将lambda分配给Java 8中的变量?
这个问题的答案建议你去做你不能做的事情。
那么,文章中的信息是不正确的,还是我在这里误读了什么?
谢谢!
发布于 2015-02-05 05:55:52
从这个意义上说,这篇文章是正确的,不能根据BiFunction类型的对象进行排序,但是您总是可以使用Comparator。但是,嘿,他们都可以有相同的身体。例如:
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被构造并且它得到了它的类型,那么你就不能改变它。因此,不能将类型为func的BiFunction传递给期望Comparator的排序。
https://stackoverflow.com/questions/28336350
复制相似问题