Java知識點——Comparator比較器

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章