类介绍
- 这个类是对集合类中的元素进行排序的接口,这个接口的实现类可以传递给
Collections.sort()
,Arrays.sort()
之类的方法,然后对集合中的元素进行排序。 -
A.equals(B)
B.equals(A)
C.compare(A,B)==0
,在定义Comparator
的类时一定要遵守这个规范 - 如果是为了给可以序列化的类进行排序,那么实现
Comparator
类时最好也实现了Serialable
方法 - 实现了
Comparator
的类可以选择性的支持对null
的比较,而实现Comparable
的类不能
类代码解析
int compare(T o1, T o2);
比较o1
,o2
,返回的结果为int result
。
-
result > 0
o1 > 02
-
result < 0
o1 < o2
-
result = 0
o1 = o2
注意:返回的结果不止有正负限制,最好绝对值相同。比如正负一。
default Comparator<T> reversed()
返回一个比较器,比较的结果是原来的相反数。其实实现也挺好实现的,包装一个装饰类就好。
public static <T extends Comparable<? super T>> Comparator<T> reverseOrder();
返回和正常比较顺序相反一个比较器。
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder();
返回和正常比较顺序相同的一个比较器
default Comparator<T> thenComparing(Comparator<? super T> other);
return (Comparator<T> & Serializable) (c1, c2) -> {
int res = compare(c1, c2);
return (res != 0) ? res : other.compare(c1, c2);
};
- 返回一个实现了
Comparator<T>
和Serializable
两个接口的类 - 返回的比较器的比较思路是:先调用本比较器进行比较,如果比较结果是相等就调用传入的比较器进行进一步比较
default <U> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor,Comparator<?super U> keyComparator)
执行结果和上一个函数相似。
区别是,在使用本比较器结果是相等时,在调用传入的比较器前会先调用方法keyExtractor
对等待比较的对象进行处理
default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor)
处理思路:
- 先调用本比较器进行比较
- 比较失败后,调用传入的函数对对象进行处理
- 然后使用对象本身的
compareTo()
进行比较
default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor)
处理思路:
- 先调用本比较器进行比较
- 比较失败后,调用
keyExtractor()
方法对待处理对象进行处理。处理结果为整数- 然后调用整数的比较方法进行比较
default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor);
Long
呗
default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor);
Double
public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator);
做了一次封装。null
不抛异常,认为null
比所有的其他值都小。
public static <T, U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor,Comparator<? super U> keyComparator)
先处理,后调用传入的方法进行比较
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor)
先处理,然后调用待比较对象的compareTo()
比较
public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)
思路:
- 对传入的对象使用
keyExtractor()
处理,获得int
结果- 使用
Integer.compare()
进行比较
public static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)
Long
public static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor)
Double
网友评论