Java知識點——Comparator比較器
- 2020 年 3 月 18 日
- 筆記
Comparator接口包含很多方便的靜態方法來創建比較器。這些方法可以用於lambda達 式或方法引用。
靜態comparing方法取一個「鍵提取器」函數,它將類型T映射為一個可比較的類型(如String) 對要比較的對象應用這個函數,然後對返回的鍵完成比較。例如,假設有一個Person對象數組,可以按名字對這些對象偶排序: Array.sort(people, Comparator.comparing(Peron::getName); 與手動實現一個Comparator相比,這當然要容易得多。另外,代碼也加 清晰,因為顯然我們都是按照人名來進行比較。 可以把比較器與thenComparing方法串起來,例如: Array.sort(people, Comparator.comparing(Peron::getLastName) .thenComparing(Peron::getFirstName)); 如果兩個人的姓相同,就會使用第二個比較器。 這些方法有很多變體形式。可以為comparing和thenComparing方法提取的鍵指定一個比較器,例如,可以如下根據人名長度進行排序: Array.sort(people, Comparator.comparing(Peron::getName, (s, t) -> Integer.compare(s.length(), t.length()); 另外,comparing和thenComparing方法都有變體形式,可以避免int、long或者double值得裝箱,要完成前一個操作,還有一種更加容易的做法: Arrays.sort(people, Comparator.comparingInt(p -> p.getName().length())); 如果函數可以返回null,可能就要用到nullsFirst和nullLast適配器。這些靜態方法會修改現有的比較器,從而在遇到null是不會拋出異常,而是將這個值標記為小於或大於正常值。例如,假設一個人沒有中名時getMiddleName會返回一個null,就可以使用 Comparator.comparing(Person::getMiddleName(),Comparator.nullsFirst(…))
nullFirst方法需要一個比較器,在這裡就是比較兩個字符串的比較器,naturalOrder 可以為任何實現了Comparable的類建立一個比較器。在這裡,Comparator.naturalOrder() 正是我們需要的。下面是一個完整的調用,可以按可能為null的中文名進行排序。 這裡使用了一個靜態導入java.util.Comparator.*,以便於理解這個表達式。注意naturalOrder的類型可以推導得出。 Arrays.sort(people, comparing(Person::getMiddleName, nullsFirst(naturalOrder())); 靜態reverseOrder方法會提供自然順序的逆序。要讓比價器逆序比較,可以使用reversed實例方法,例如naturalOrder().reversed()等同於reverseOrder()。
我的同學總結的特別好,借鑒一下: https://blog.csdn.net/qq_40197991/article/details/104928742


