如何在 Java 8 中使用自定义比较器接口对对象数组进行排序?

How to sort an object Array using a custom Comparator interface in Java 8?

比较器的自定义实现

@FunctionalInterface
public interface Comparator<T>  {

int compare(T t1, T t2);

static <T> Comparator<T> comparing(
        Function<T, Comparable> f){
    return (p1, p2) -> f.apply(p1).compareTo(f.apply(p2));
}

default Comparator<T> thenComparing(
        Comparator<T> cmp){
            return (p1, p2) ->
                    this.compare(p1, p2) == 0 ?
                            cmp.compare(p1, p2) : this.compare(p1, p2);
}

default Comparator<T> thenComparing(
        Function<T, Comparable> f){
            Comparator<T> cmp = comparing(f);
    return thenComparing(cmp);
  }
}

我创建了一个包含三个字段的人 class,即 firstName、lastName 和 age,以及它们各自的 getter 和 setter。使用自定义比较器 class 我想对 main 中的一组人进行排序,如下所示:

    Comparator<Person> cmp = Comparator
            .comparing(Person::getLastName) // Extract Property and compare
            .thenComparing(Person::getFirstName)
            .thenComparing(Person::getAge);

     Person arr[] = new Person[]{
        new Person("Sean", "Gilmore", 22),
                new Person("Aaron", "Reidy", 21),
                new Person("Jane", "Kennedy", 53),
                new Person("Mike", "English", 49)
    };


    Arrays.sort(arr, cmp);

然而 Arrays.sort(arr, cmp); 抛出一个编译错误 no instance of type variable T exists so that Comparator<Person> conforms to Comparator<? super T>

我被这个错误弄糊涂了,我想知道如何使用 cmp 比较器对 Person 数组进行排序。

Javaclass 的完全限定名称包括它的包名称。

Arrays.sort 方法需要 java.util.Comparator 实现。你的自定义 Comparatorjava.util.Comparator 不一样。

Arrays class 中的 sort 方法是 static 方法,因此您不能扩展 Arrays 和覆盖此方法。如果要使用 Arrays.sort,请使用 java.util.Comparator 的实现。没办法了。

您可以像这样轻松地使 Comparator 适应 JDK:

Arrays.sort(arr, cmp::compare);

我相信 Guava 在为 Java 8.

改造之前推荐了类似的模式来调整其功能接口