Gro*_*Man 7 java lambda java-8 bifunctor
我一直只使用Java 6,现在正赶上学习Java 8中的新功能.我在这里阅读这篇文章:http: //www.drdobbs.com/jvm/lambda-expressions-in-java-8/240166764?PGNO = 2
它说:
Java API在java.util.function包中定义了几个通用的功能接口.其中一个接口BiFunction描述了参数类型为T和U且返回类型为R的函数.您可以将我们的字符串比较lambda保存在该类型的变量中:
BiFunction<String, String, Integer> comp
= (first, second) -> Integer.compare(first.length(), second.length());
Run Code Online (Sandbox Code Playgroud)
但是,这对排序没有帮助.没有需要BiFunction的Arrays.sort方法.如果您以前使用过函数式编程语言,您可能会发现这很奇怪.但对于Java程序员来说,这很自然.Comparator之类的接口具有特定目的,而不仅仅是具有给定参数和返回类型的方法.Java 8保留了这种风格.当您想要使用lambda表达式执行某些操作时,您仍然需要牢记表达式的用途,并为其提供特定的功能接口.
但是,当我看到这个帖子时: 你如何在Java 8中为一个变量赋一个lambda?
那里的问题的答案建议完全按照引用的段落说你做不到的.
那么,文章中的信息是不正确的,还是我在这里读错了?
谢谢!
Mis*_*sha 20
我没有看到链接的SO答案中的任何内容与文章相矛盾.
类型系统的常规规则适用于功能接口.
如果将变量声明为BiFunction<String,String,Integer> bifunc,则不允许将其传递给需要Comparator<String>因为BiFunction<String,String,Integer>不是子类型的方法Comparator<String>.
功能类型遵循所有通常规则的事实是允许以最小的扰动添加这个新功能.
如果你想做Comparator一个BiFunction你需要做的就是这样添加::apply:
BiFunction<String,String,Integer> bifunc = (a,b) ->
Integer.compare(a.length(), b.length());
Arrays.sort(array, bifunc::apply);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7826 次 |
| 最近记录: |