簡體   English   中英

這個Java排序如何工作?

[英]How does this Java sorting work?

以下代碼工作正常。 但我無法理解它是如何工作的? 你能解釋一下嗎? 特別是sortEmployeeByCriteria的方法簽名(見下文)。

我明白它返回List<T>但是什么是<T, U extends Comparable<? super U>> <T, U extends Comparable<? super U>>

public static void sortIt() {
    Employee[] employees = new Employee[] {
        new Employee("John", 25, 3000.0, 9922001),
        new Employee("Ace", 22, 20000.0, 5924001),
        new Employee("Keith", 35, 4000.0, 3924401)
    };

    List<Employee> employeeList  = Arrays.asList(employees);
    List<Employee> list = sortEmployeeByCriteria(employeeList, Employee::getName);
    list.stream().forEach(System.out::println);
}

// But could you please explain the method signature how is it working
public static <T, U extends Comparable<? super U>> List<T> sortEmployeeByCriteria( List<T> list, Function<? super T, ? extends U> byCriteria) {
    Comparator<? super T> comparator = Comparator.comparing(byCriteria);
    list.sort(comparator);
    return list;
}

答案在於sortEmployeeByCriteria()的第一行:

Comparator<? super T> comparator = Comparator.comparing(byCriteria);

查看Comparator.comparing()文檔 (靜態方法,與sortEmployeeByCriteria()相同):

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

接受從類型T中提取Comparable排序鍵的函數,並返回通過該排序鍵進行比較的Comparator。

所以<T, U extends Comparable<? super U>> <T, U extends Comparable<? super U>>static方法中的一個類型參數( static <T> void someMethod(U objectOfTypeU) ),它具有Comparator.comparing()方法所需的一些邊界。 它還允許您使用(通用)類型T作為返回值(即List<T> )。

它不是lambda - 它是一個方法引用( Employee::getName部分)。 sortEmployeeByCriteria只是一個普通的通用靜態方法,采用類型為T的List,以及一個采用T(或子類)並生成類型為U(或子類)的函數的函數 ,並返回類型為T的(已排序)列表。

不尋常的部分可能是比較器#比較 ,它創建了一個比較器,它將比較給定映射的T s,即它將T (在您的情況下是一個Employee )轉換為U ,在您的情況下是一個StringgetName結果),它知道如何比較,因為String實現了Comparable。 然后它繼續使用List#sort(Comparator)對它們進行實際排序。

Employee::getName基本上是一個簡寫,一個方法引用,你可以傳遞而不是創建自己的Function實例。

暫無
暫無

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

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