【发布时间】:2019-07-21 23:10:48
【问题描述】:
试图理解方法引用,但很难解决它。 卡住了比较器的例子。
为了让我的大脑更轻松,我一直从基础开始(匿名类实现>>兰巴表达式>>方法参考) 我无法使用方法引用和 Comparator 示例。
我想要排序的 POJO(从一些互联网示例中提取 - mkyong)
public class Fruit{
private int quantity;
private String name;
....
}
创建要使用的测试数据:
Fruit[] fruits = new Fruit[3];
Fruit pineapple = new Fruit("pineapple",10);
Fruit orange= new Fruit("orange",4);
Fruit kiwi= new Fruit("kiwi",15);
fruits[0] = pineapple;
fruits[1] = orange;
fruits[2] = kiwi;
匿名排序类实现:
Comparator<Fruit> anonymousSortByname = new Comparator<Fruit>(){
public int compare(Fruit f1,Fruit f2){
return f1.getName().compareTo(f2.getName());
}
};
排序:
Arrays.sort(fruits,anonymousSortByname);
现在我明白了,匿名类可以转换为 lambda 表达式(只要它们是函数式接口等......)
Lambda 实现:
Comparator<Fruit> lambdaSortByname =
(Fruit f1,Fruit f2) -> f1.getName().compareTo(f2.getName());
好的,到目前为止,事情是有道理的。
我的理解:“无论在何处使用 lambda,它们可以替换为‘方法引用’”
确实在 SO 和互联网上阅读到,使用“方法引用”不是强制性的,但我的目标是理解它们 - 所以是否使用不是我的问题 :)
也在这里阅读: method reference1 和 here 和 here 。 但是,当我尝试使用 Comparator 实现方法引用时,我遇到了困难。
这是我尝试过的,它给了我一个编译错误。
Comparator<Fruit> methodRefComparator = Comparator::compare;
编译错误:
无法对非静态代码块进行静态引用
在链接中,该示例确实讨论了 Comparator 接口中的“比较”方法,但此时变得模糊......
编辑#1
根据下面的cmets修改了问题:
困惑在于 Comparator 的“comparing”方法是如何工作的。
我确实得到了一个工作示例(通过谷歌搜索而不是根据我自己的理解):
首先创建了一个接受“水果”作为输入并返回字符串的函数。
Function<Fruit, String> funcName = (Fruit f1) -> f1.getName();
然后将此“函数”传递给“比较器”的“比较”方法,以获取所需的比较器。
Comparator<Fruit> sortByName = Comparator.comparing(funcName);
现在排序工作:
Arrays.sort(fruits,sortByName );
但是..我无法理解它是如何工作的。 我没有提供 Comparator 的实现(f1.getName() - f2.getName())那么它是如何工作的呢?
这更像是一个合同,编译器能够理解,因为我已经为它提供了一个带有“getName”实现的函数,它将在返回的比较器中使用它?
【问题讨论】:
标签: lambda java-8 method-reference