为什么Comparator.compare有两个参数?

时间:2015-05-27 15:28:12

标签: java

我希望了解这种看似不一致的地方:

Comparator.compare将两个对象作为输入参数进行比较并对它们进行比较,而不是对this执行任何操作。为什么它不能成为静态方法?

Comparator.equals将另一个对象作为输入参数,并将其与this进行比较。

为什么设计范式存在差异?为什么compare只询问一个Object参数并将其与此进行比较?

6 个答案:

答案 0 :(得分:2)

Comparator.equals()的实现将覆盖Object.equals(),并且应该将 Comparator本身与另一个Comparator进行比较。因此,它与Comparator.compare()无关,{{1}}应该比较另一种类型的两个对象。

参见Chetan Kinger关于静态部分的答案。

答案 1 :(得分:1)

等于将此比较器与另一个比较器进行比较。 比较涉及泛型参数类型的两个值。

假设您将使用静态功能制作自己的比较API。然后你可以传递一个Java 8"函数。"

myCollection.mySort(MyComparator::compare);

然后用一些额外的标准来制作一个参数化的比较器是很困难的。静态字段在多线程系统中是不可行的。

但是,您可能喜欢可组合比较器的java 8构建器模式

Comparator<Employee> fullNameComparator = 
        Comparator.comparing(Employee::getLastName)
                  .thenComparing(Employee::getFirstName);
employees.sort(fullNameComparator);

答案 2 :(得分:0)

Comparator允许给定类的无限数量的可能实现。例如,这允许您按照许多不同的标准对列表进行排序。

假设您有一份员工列表。您可以使用按工资排序的比较器和按名称排序的另一个比较器。

从Object重写equals()方法。这种设计允许类实现者指定两种实例被认为相等的唯一方式。请注意,为专门用作比较器的类重写equals()会有点不寻常。

答案 3 :(得分:0)

虽然Sotirios的答案是正确的,但比较器也像一个外部&#34;工具&#34;比较&#34;事物&#34; (两个对象),因此将比较器引用给自身没有任何意义(&#34;这个&#34;引用)。想象一下比较器作为一对比例尺:它不会测量自身,而是测量两个不同的物体重量。

对于&#34;这个&#34;引用你必须实现另一个接口Comparable,它更类似于内置的Object&#34; equals&#34;。

答案 4 :(得分:0)

  

为什么它不能成为静态方法?

无法覆盖static方法。如果compare中的Comparator方法是静态的,那么实现Comparator的类就无法定义自己的比较策略。此外,static方法实际上不是Comprator接口合同的一部分。 (Java 8允许接口具有静态方法)

  

为什么不比较只要求一个Object参数和比较   它到这个

Comparator的目的是允许您定义一个或多个不是类的自然比较策略的比较策略。理想情况下,Comparator必须由与其定义比较策略的类不同的类实现。因此,Comparator依赖于它定义比较策略的类的this引用是没有意义的。如果要为类定义自然比较策略,则可以实现ComparableComparable有一个compareTo方法,可以在this上运行,因此只需要一个参数。

答案 5 :(得分:0)

  

Comparator.compare将两个对象作为输入参数进行比较并对它们进行比较,而不是对此进行任何操作。为什么它不能成为静态方法?

它可能是静态的,但这会阻止您将比较函数作为参数传递给其他函数。因为函数不是Java中的一等公民,所以你必须用一个接口来包装那个单一的函数,以使它可以通过。

  

Comparator.equals将另一个对象作为输入参数并将其与此进行比较。   为什么设计范式存在差异?为什么不比较只要求一个Object参数并将其与此进行比较?

equals方法,用于查看当前比较器是否等于其他比较器,而不是用于比较任意对象。