靜態(tài)方法 Comparator.comparing 返回一個(gè) Comparator 對象,該對象提供了一個(gè)函數(shù)可以提取排序
關(guān)鍵字。
新的實(shí)例方法包含了下面這些。
- reversed ——對當(dāng)前的 Comparator 對象進(jìn)行逆序排序,并返回排序之后新的
Comparator 對象。 - thenComparing ——當(dāng)兩個(gè)對象相同時(shí),返回使用另一個(gè) Comparator 進(jìn)行比較的
Comparator 對象。 - thenComparingInt 、 thenComparingDouble 、 thenComparingLong ——這些方法的
工作方式和 thenComparing 方法類似,不過它們的處理函數(shù)是特別針對某些基本數(shù)據(jù)類型(分別對應(yīng)于 ToIntFunction 、 ToDoubleFunction 和 ToLongFunction )的。
新的靜態(tài)方法包括下面這些。
comparingInt 、 comparingDouble 、 comparingLong ——它們的工作方式和 comparing 類似,但接受的函數(shù)特別針對某些基本數(shù)據(jù)類型(分別對應(yīng)于 ToIntFunction 、
ToDoubleFunction 和 ToLongFunction )。naturalOrder ——對 Comparable 對象進(jìn)行自然排序,返回一個(gè) Comparator 對象。
nullsFirst 、 nullsLast ——對空對象和非空對象進(jìn)行比較,你可以指定空對象(null)
比非空對象(non-null)小或者比非空對象大,返回值是一個(gè) Comparator 對象。reverseOrder ——和 naturalOrder().reversed() 方法類似。
按照給定的集合順序?qū)δ繕?biāo)集合進(jìn)行排序
List<String> list1 = new ArrayList<>();
list1.add("7388345e");
list1.add("982c504e");
list1.add("e5a90522");
list1.add("4445e195");
List<String> list2 = new ArrayList<>();
list2.add("4445e195");
list2.add("f87775bc");
list2.add("7388345e");
list2.add("443c55a4");
list2.add("e5a90522");
list2.add("982c504e");
// list1.sort(Comparator.comparingInt(list2::indexOf));
list1 = list1.stream()
.sorted(Comparator.comparingInt(list2::indexOf))
.collect(Collectors.toList());
System.out.println(list1);
/** list1是目標(biāo)集合, 按照list2的順序進(jìn)行排序
返回結(jié)果:
[4445e195, 7388345e, e5a90522, 982c504e]
*/
逆序
// 源碼
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor) {
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
// 錯(cuò)誤寫法
list1.sort(Comparator.comparing(val -> val.substring(1,2)).reversed());
編譯不會(huì)通過, Connot resolve method 'substring' in 'Object'
Lambda的類型是從使用Lambda的上下文推斷出來的,這里的 val 會(huì)被解析成Object,當(dāng)然找不到 substring。

錯(cuò)誤編寫
// 正確寫法
list1.sort(Comparator.comparing((String val) -> val.substring(1,2)).reversed());
/** 返回結(jié)果:
[982c504e, e5a90522, 4445e195, 7388345e]
*/
比較器鏈
list1.sort(Comparator.comparing((String val) -> val.substring(val.length() - 1))
.reversed()
.thenComparing((String val) -> val.substring(val.length() - 2)));
/**
先按照最后一位逆序, 如果最后一位相同, 再按照倒數(shù)第二位排序
[982c504e, 7388345e, 4445e195, e5a90522]
*/