当前位置: 首页 > 知识库问答 >
问题:

Java—Comparator类比较方法的定义

时恩
2023-03-14

我想了解Comparator类的comparing方法的定义。我会留下一些代码,以防它有助于解释。我正在使用一个名为Person的类,它基本上存储一个名字和一个姓氏。可以使用get方法检索此数据。

public class Person {

    private final String name;
    private final String lastname;

    public Person(String name, String lastname) {
        this.name = name;
        this.lastname = lastname;
    }

    public String getName() { return name; }

    //...
}

然后,我创建了一个人员列表:

List<Person> list = Arrays.asList(
    new Person("Juan", "García"),
    new Person("Ana", "Martínez"),
    ...
);

我一直在测试不同的方法来对这个人员列表进行排序。在其他可能性中,我发现了这个:

list.sort(Comparator.comparing(Person::getName));

我明白这些行的作用。基本上,此列表是使用比较器排序的,该比较器使用排序键(Person的名称)进行比较。此类键是使用对属于Person类的getName方法的引用提取的。

但是,我也喜欢了解幕后发生了什么。我的问题是比较方法。Java留档这样定义方法:

static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)

特别是,我正在努力解决泛型类型定义:<代码>

T表示比较器类型,而U表示键类型,对吗?所以为什么U需要扩展比较

参数中,该函数与属于T的任何超类的对象一起工作,并返回属于U的任何子类的对象(

我希望我的怀疑是明确的。还有,很抱歉解释得太长了。


共有2个答案

通典
2023-03-14

让我们考虑一下上述方法的签名比较静态

>

  • T是被比较对象的类型,在提到的情况下是Person

    U扩展

    <代码>功能

  • 朱渝
    2023-03-14

    我在这里看到三个主要的困惑:

    这是对U(键的类型)的约束,指定了U可以是什么特定类型。它说U必须是可比的。有道理,对吧?尖括号中的部分指定了“什么东西可以U比较?”例如,可比

    你可能想知道为什么它不说“U必须与U可比”,即U扩展为可比

    假设我有一个键提取器,它接受一个对象,并返回它的输出作为要比较的键(这是一个非常不常见的比较对象,但为了这个示例,请注意:D)

    Function<Object, String> stringExtractor = Object::toString;
    

    现在我想要一个比较动物的比较器。我可以使用此stringExtractor作为比较的参数吗?我当然可以:

    Comparator<Animal> comparator = Comparator.comparing(stringExtractor);
    

    所有动物都有一个toString方法,因为它们毕竟是Object的子类!这就是为什么key extractor参数采用超类为T的函数,以允许我们传递上述内容。如果是<代码>功能

    同样,我们希望比较尽可能多的东西。

    这实际上是完全不必要的。除非您像这样明确指定TU

    Comparator.<Foo, Animal>comparing(Foo::getDog);
    

    它是否是功能没有区别

     类似资料:
    • 本文向大家介绍Java Comparator比较器实例解析,包括了Java Comparator比较器实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java Comparator比较器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 说几点需要注意的,提醒自己即可: 以下是单独定义一个比较器的类,实现了Comparat

    • 问题内容: 我头疼,调试困难。我正在尝试比较两个通用值,以便可以根据值将它们插入到数组中进行排序。这是我第一次使用Comparable和Comparator界面,因此围绕这些问题的任何其他建议都是不错的选择。 这是我的班级设置方式: put()方法: 这些是我要实现的compareTo()和compare方法。 我遇到的第一个问题是compareTo()方法中的问题,它以“ this”为中心。该错

    • 我正在做一个关于java类的介绍的作业,该作业要求使用方法将温度从摄氏转换为华氏,反之亦然。它需要使用三种比较方法,而我无法弄清楚该把什么放进去。以下是说明: 三种比较方法: -此方法将另一个温度作为参数,如果调用对象具有与other相同的温度,则返回true,否则返回false。注意,摄氏温度可以等于华氏温度,如上式所示。 -如果调用对象的温度低于其他温度,则此方法将返回true,否则返回fal

    • 本文向大家介绍对比Java中的Comparable排序接口和Comparator比较器接口,包括了对比Java中的Comparable排序接口和Comparator比较器接口的使用技巧和注意事项,需要的朋友参考一下 Comparable Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在

    • 对于某个项目,我必须按地区和名称订购一些数字。首先,它们按面积从大到小排序,如果它们一致,则按字母顺序排序。在一个名为的类中,我有一个类型如下的内部类: 如果我想从另一个类对一组进行排序,我该如何做?我认为最好的方法是下面的,但失败了(

    • 问题内容: 我想比较Java中的类类型。 我以为我可以这样做: 我想比较一下是否传递给函数的obj是从MyObject_1扩展而来的。但这是行不通的。似乎getClass()方法和.class提供了不同类型的信息。 如何比较两个类类型,而不必创建另一个伪对象来比较类类型? 问题答案: 试试这个: 由于继承,这对接口也有效: 有关instanceof的更多信息,请访问:http : //mindpr