簡體   English   中英

如何使用Java 8中的自定義Comparator接口對對象進行排序?

[英]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);
  }
}

我創建了一個包含三個字段的Person類,即firstName,lastName和age,以及它們各自的getter和setter。 使用自定義Comparator類我想在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> no instance of type variable T exists so that Comparator<Person> conforms to Comparator<? super T>

我被這個錯誤拋棄了,我想知道如何使用cmp Comparator對Person數組進行排序。

Java中 class的完全限定名稱包括它的包名。

Arrays.sort方法需要java.util.Comparator實現。 您的自定義Comparatorjava.util.Comparator

Arrays類中的sort方法是一個static方法,因此您無法擴展Arrays並覆蓋此方法。 如果要使用Arrays.sort ,請使用java.util.Comparator的實現。 沒有其他辦法了。

您可以輕松地將Comparator調整為JDK,如下所示:

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

我相信Guava建議使用類似的模式來修改它們的功能接口,然后再為Java 8進行改造。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM