【发布时间】:2019-02-07 10:08:17
【问题描述】:
我已经看到在 Java 8 中,可以这样定义比较器:
Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge());
相当于:
Comparator d = new Comparator<Computer> () {
@Override
public int compare(Computer c1, Computer c2){
return c1.getAge().compareTo(c2.getAge());
}
};
我想了解它是如何工作的。在第二个示例中,它相当简单:使用compare 方法创建一个Comparator 对象,该方法使用Computer 的age 属性中的compareTo 方法执行比较。当我们这样做时,我们会简单地调用这个方法:
Computer comp1 = new Computer(10);
Computer comp2 = new Computer(11);
d.compare(comp1, comp2); // -1
但是在第一个示例中,当使用 lambda 时发生了什么?在我看来,我们将Comparator 设置为等于执行比较的方法。但这不可能,因为Comparator 对象是具有compare 方法的对象。我了解到 lambda 可以与功能接口(只有一种方法的接口)一起使用。但是Comparator 不是函数式接口(它除了compare 之外还有很多其他方法!)。那么Java解释器怎么知道我们正在实现的是compare方法呢?
【问题讨论】:
-
好的,它有一个抽象方法。 (作为实施者)
-
没有。
Comparator接口只有一种没有实现的方法。equals不是Comparator作为接口的一部分,它来自Object类并有一个实现。 -
那为什么在文档的“抽象方法”选项卡下列出了两种方法(见我上面的链接)?