[英]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
,在您的情況下是一個String
( getName
結果),它知道如何比較,因為String實現了Comparable。 然后它繼續使用List#sort(Comparator)
對它們進行實際排序。
Employee::getName
基本上是一個簡寫,一個方法引用,你可以傳遞而不是創建自己的Function
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.