静态方法 Comparator.comparing 返回一个 Comparator 对象,该对象提供了一个函数可以提取排序
关键字。
新的实例方法包含了下面这些。
- reversed ——对当前的 Comparator 对象进行逆序排序,并返回排序之后新的
Comparator 对象。 - thenComparing ——当两个对象相同时,返回使用另一个 Comparator 进行比较的
Comparator 对象。 - thenComparingInt 、 thenComparingDouble 、 thenComparingLong ——这些方法的
工作方式和 thenComparing 方法类似,不过它们的处理函数是特别针对某些基本数据类型(分别对应于 ToIntFunction 、 ToDoubleFunction 和 ToLongFunction )的。
新的静态方法包括下面这些。
-
comparingInt 、 comparingDouble 、 comparingLong ——它们的工作方式和 comparing 类似,但接受的函数特别针对某些基本数据类型(分别对应于 ToIntFunction 、
ToDoubleFunction 和 ToLongFunction )。 -
naturalOrder ——对 Comparable 对象进行自然排序,返回一个 Comparator 对象。
-
nullsFirst 、 nullsLast ——对空对象和非空对象进行比较,你可以指定空对象(null)
比非空对象(non-null)小或者比非空对象大,返回值是一个 Comparator 对象。 -
reverseOrder ——和 naturalOrder().reversed() 方法类似。
按照给定的集合顺序对目标集合进行排序
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是目标集合, 按照list2的顺序进行排序
返回结果:
[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));
}
// 错误写法
list1.sort(Comparator.comparing(val -> val.substring(1,2)).reversed());
编译不会通过, Connot resolve method 'substring' in 'Object'
Lambda的类型是从使用Lambda的上下文推断出来的,这里的 val 会被解析成Object,当然找不到 substring。
// 正确写法
list1.sort(Comparator.comparing((String val) -> val.substring(1,2)).reversed());
/** 返回结果:
[982c504e, e5a90522, 4445e195, 7388345e]
*/
比较器链
list1.sort(Comparator.comparing((String val) -> val.substring(val.length() - 1))
.reversed()
.thenComparing((String val) -> val.substring(val.length() - 2)));
/**
先按照最后一位逆序, 如果最后一位相同, 再按照倒数第二位排序
[982c504e, 7388345e, 4445e195, e5a90522]
*/