「lambda表達式」Comparator接口
Comparator 接口包含很多方便的靜態(tài)方法來創(chuàng)建比較器。 這些方法可以用于 lambda 表達式或方法引用。
靜態(tài) comparing 方法取一個“ 鍵提取器” 函數(shù), 它將類型 T 映射為一個可比較的類型 ( 如 String ) 。對要比較的對象應(yīng)用這個函數(shù), 然后對返回的鍵完成比較。例如,假設(shè)有一個 Person 對象數(shù)組,可以如下按名字對這些對象排序: Arrays.sort(people, Comparator.comparing(Person::getName));
與手動實現(xiàn)一個 Compamtor 相比, 這當(dāng)然要容易得多。另外,代碼也更為清晰, 因為顯然我們都希望按人名來進行比較。
可以把比較器與 thenComparing 方法串起來。 例如:
如果兩個人的姓相同, 就會使用第二個比較器。 這些方法有很多變體形式。可以為 comparing 和 thenComparing 方法提取的鍵指定一個 比較器。例如,可以如下根據(jù)人名長度完成排序:
另外, comparing 和 thenComparing 方法都有變體形式,可以避免 int、 long 或 double 值 的裝箱。要完成前一個操作, 還有一種更容易的做法:
如果鍵函數(shù)可以返回 null , 可能就要用到 nullsFirst 和 nullsLast 適配器。這些靜態(tài)方法會修改現(xiàn)有的比較器,從而在遇到 null 值時不會拋出異常, 而是將這個值標(biāo)記為小于或 大于正常值。例如, 假設(shè)一個人沒有中名時 getMiddleName 會返回一個 null, 就可以使用 Comparator.comparing(Person::getMiddleName(), Comparator.nullsFirst(… ) 。
nullsFirst 方法需要一個比較器,在這里就是比較兩個字符串的比較器。naturalOrder 方法可以為任何實現(xiàn)了 Comparable 的類建立一個比較器。在這里,Comparator.naturalOrder() 正是我們需要的。下面是一個完整的調(diào)用, 可以按可能為 null 的中名進行排序。這里使用了一個靜態(tài)導(dǎo)入 java.util.Comparator.* 以便理解這個表達式。注意 naturalOrder 的類型可以推導(dǎo)得出。
Arrays.sort(people, comparing(Person::getMiddleName , nullsFirst(naturalOrder())));
靜態(tài) reverseOrder 方法會提供自然順序的逆序。要讓比較器逆序比較, 可以使用 reversed 實例方法。例如 naturalOrder().reversed() 等同于 reverseOrder()。