📜  Java中的比较器 thenComparingDouble() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:02:02.894000             🧑  作者: Mango

Java中的比较器 thenComparingDouble() 方法及示例

在Java中,我们经常需要按照某种规则进行对象排序。比如要根据数字的大小或字符串的字典序来排序。Java提供了一种方便的方式来实现对象的比较,就是使用比较器。

比较器是一个实现了Comparator接口的对象,它可以用来比较两个对象的大小。在Java的标准库中,有一个专门用来排序的类叫做Collections,它提供了sort()方法来对一个List中的元素进行排序,但是需要我们提供一个比较器。通过指定不同的比较器,我们可以得到不同的排序结果。

Java中的比较器有两种,一种是实现了Comparable接口的类的自然排序,另一种是实现了Comparator接口的比较器。Comparator接口有一个常用的方法叫做thenComparingDouble(),它可以用来实现多关键字的排序。

thenComparingDouble() 方法

thenComparingDouble()方法是Comparator接口中的一个方法,它的作用是返回一个比较器,该比较器首先按照指定的Comparator进行比较,如果前一个比较器认为两个对象是相等的,则再根据给定的函数式接口DoubleFunction计算出两个对象的双精度浮点数值,从而再次进行判断大小的比较。

该方法的函数签名如下:

public default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)

其中,T是被比较的对象类型。

示例

下面是一个示例,我们将使用一个Person类来演示thenComparingDouble()方法的使用。Person类有name和age两个字段,我们希望先按照name进行字典序排序,如果name相同,则按照age从小到大排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.ToDoubleFunction;

class Person {
    String name;
    int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Alice", 20));
        persons.add(new Person("Bob", 25));
        persons.add(new Person("Catherine", 30));
        persons.add(new Person("David", 30));
        persons.add(new Person("Emily", 35));

        // 按名字排序
        Comparator<Person> byName = Comparator.comparing(Person::getName);

        // 如果名字相同,则按年龄从小到大排序
        Comparator<Person> byAge = Comparator.comparingInt(Person::getAge);
        Comparator<Person> byNameAndAge = byName.thenComparingDouble(person -> person.getAge());

        Collections.sort(persons, byNameAndAge);
        for (Person person : persons) {
            System.out.println(person.getName() + " " + person.getAge());
        }
    }
}

输出结果如下:

Alice 20
Bob 25
Catherine 30
David 30
Emily 35

从上面的结果来看,我们首先按照name进行了排序,如果name相同,则按照age从小到大排序。这就是thenComparingDouble()方法的作用。