Java 为什么Comparator.compare接受两个参数?
我希望了解这种表面上的差异: 将两个对象作为输入参数并对其进行比较,而不使用或对Java 为什么Comparator.compare接受两个参数?,java,Java,我希望了解这种表面上的差异: 将两个对象作为输入参数并对其进行比较,而不使用或对此执行任何操作。为什么它不能是一个静态的方法呢 将另一个对象作为输入参数,并将其与此进行比较 为什么在设计范式上存在差异?为什么不让compare只要求一个对象参数并将其与此进行比较?Comparator.equals()的实现将覆盖Object.equals(),它应该将比较器本身与另一个比较器进行比较。因此,它与用来比较另一种类型的两个对象的Comparator.compare()无关 静态部分请参见Chetan
此
执行任何操作。为什么它不能是一个静态的方法呢
将另一个对象作为输入参数,并将其与此进行比较
为什么在设计范式上存在差异?为什么不让
compare
只要求一个对象参数并将其与此进行比较?Comparator.equals()的实现将覆盖Object.equals()
,它应该将比较器本身与另一个比较器进行比较。因此,它与用来比较另一种类型的两个对象的Comparator.compare()
无关
静态部分请参见Chetan Kinger的答案。Comparator允许给定类的无限数量的可能实现。例如,这允许您按照许多不同的标准对列表进行排序
假设您有一个员工列表。你们可以在比较器上设置一个按薪水排序的,另一个按名字排序的
equals()方法从对象重写。这种设计允许类实现者指定两个实例相等的唯一方法。请注意,对于专门用作比较器的类,重写equals()有点不寻常。虽然Sotirios的答案是正确的,但比较器也像一个外部“工具”来比较“事物”(两个对象),因此将比较器自身引用(“此”引用)没有任何意义。将比较器想象成一对天平:它不测量自身,而是测量两个不同物体的重量
对于“this”引用,您必须实现另一个类似于内置对象“equals”的接口
为什么它不能是一个静态的方法呢
无法重写静态方法。如果Comparator
中的compare
方法是静态的,那么实现Comparator
的类将无法定义自己的比较策略。另外,静态
方法实际上不是压缩机
接口契约的一部分。(Java 8允许接口具有静态方法)
为什么不直接请求一个对象参数并进行比较呢
这件事很重要
比较器的目的是允许您定义一个或多个不是类的自然比较策略的比较策略。理想情况下,比较器
必须由与其定义比较策略的类不同的类实现。因此,比较器依赖于它定义比较策略的类的引用是没有意义的。如果要为类定义自然比较策略,可以改为实现Comparable
Comparable
有一个compareTo
方法,该方法对此
进行操作,因此只接受一个参数
Comparator.compare将两个对象作为输入参数并对其进行比较,而不对此执行任何操作。为什么它不能是一个静态的方法呢
它可以是静态的,但这会阻止您将比较函数作为参数传递给其他函数。因为函数在Java中不是一等公民,所以您必须用接口包装单个函数,使其可以通过
Comparator.equals将另一个对象作为输入参数,并将其与此对象进行比较。
为什么在设计范式上存在差异?为什么不直接请求一个对象参数并将其与此进行比较
equals
方法if用于查看当前比较器是否与其他比较器相等,而不是用于比较任意对象。equals用于将此比较器与另一个比较器进行比较。
比较涉及泛型参数类型的两个值
假设您将使用静态函数制作自己的比较API。然后可以传递一个Java8“函数
那么就很难做出一个参数化的比较器,比如说有一些额外的标准。静态字段在多线程系统中是不允许的
但是,您可能喜欢java 8 builder模式的可组合比较器
Comparator<Employee> fullNameComparator =
Comparator.comparing(Employee::getLastName)
.thenComparing(Employee::getFirstName);
employees.sort(fullNameComparator);
比较器fullNameComparator=
Comparator.comparing(Employee::getLastName)
.Then比较(雇员::getFirstName);
employees.sort(fullNameComparator);
因为接口不使用静态方法。你不能在任何地方用静态比较方法注入比较器。这只回答了第2段中的问题。围绕itComparator还有一个更大的问题。equals用于检查此比较器(在其中定义equals方法)是否等于任何其他比较器对象Wait,comparator#equals
?什么?你是说对象等于?阅读覆盖版本的Javadoc。@SotiriosDelimanolis如果您有Java 8,则不正确。为什么不进行比较?只要求一个对象参数并将其与此进行比较?@两栖体有Comparable
。因为这是Comparable
的目的,应该由能够将自身与其他对象进行比较的对象来实现。不具备该功能或可以以不同方式进行比较的对象可以将其比较“外包”到Comparator
。我将Comparable和Comparator混淆了。@AasmundEldhuset感谢您的信任。很少有人会接受这样的要求。
Comparator<Employee> fullNameComparator =
Comparator.comparing(Employee::getLastName)
.thenComparing(Employee::getFirstName);
employees.sort(fullNameComparator);