版本
JDK8(JDK1.8)
Comparator接口重点
1.Comparator接口是一个函数式接口,里面只有一个虚方法compare(T o1, T o2),该接口表示一个比较器,而实现Comparable接口则表示其实现类是可比较的,Comparable接口的虚方法是compareTo(T o)
Comparable接口源码可以看我这篇位置 Comparable
2.compare(T o1, T o2) 返回值大于0,表示 o1 - o2 > 0,若o1,o2相等,则compare(T o1, T o2) 返回0
3.Comparator接口方法
注:then开头比较器都是二次比较器,在第一次调用this.compare(T o1, T o2)两者相等,才会使用一个新的比较器来区分两者顺序,如果第一次都不相等,则不会调用后续比较器
| 方法名 | 作用 |
|---|---|
| int compare(T o1, T o2) | 返回 o1 - o2 的值 |
| Comparator comparing(Function keyExtractor) | 返回一个新的比较器,其比较规则先经过keyExtractor处理o1和o2后,再将处理后的值相减c比较大小(类似相减,其实是调用compareTo) |
| Comparator comparing( Function keyExtractor, Comparator keyComparator) | 返回一个新的比较器,其比较规则先经过keyExtractor处理o1和o2后,再将使用keyComparator比较器的规则比较大小 |
| Comparator comparingInt(ToIntFunction keyExtractor) | 和上面comparing(Function keyExtractor) 差不多,只不过ToIntFunction处理后得到的值是Int,则再两个Int相减 |
| Comparator comparingLong(ToLongFunction keyExtractor) | 和上面comparing(Function keyExtractor) 差不多,只不过ToLongFunction处理后得到的值是Long,则再两个Long相减 |
| Comparator comparingDouble(ToDoubleFunction keyExtractor) | 和上面comparing(Function keyExtractor) 差不多,只不过ToDoubleFunction处理后得到的值是Double,则再两个Double相减 |
| Comparator naturalOrder() | 返回一个自然顺序比较器,比较规则为o1.compareTo(o2),相当于o1-o2 |
| Comparator reverseOrder() | 返回一个与自然顺序比较器相反的比较器,比较规则为o2.compareTo(o1),相当于o2-o1 |
| Comparato nullsFirst(Comparator comparator) | 返回一个空友好的比较器,该比较器认为null小于非空,两个null相等 |
| Comparator nullsLast(Comparator comparator) | 返回一个空友好的比较器,该比较器认为null大于非空,两个null相等 |
| Comparator reversed() | 返回一个新的比较器,它的compare(T o1, T o2) 的作用变成返回 o2 - o1 的值,即相反 |
| Comparator thenComparing(Comparator other) | 返回一个新的比较器,当调用this.compare(T o1, T o2)时o1和o2相等,再调用other.compare(T o1, T o2)比较o1,o2,如果第一步不相等则直接返回,下面也一样 |
| Comparator thenComparing(Function keyExtractor) | 当调用this.compare(T o1, T o2)时o1和o2相等,上面的other比较器用以下步骤生成的比较器替代,该比较器符合以下步骤,会先用keyExtractor处理o1,o2,然后直接把处理后的值相减 |
| Comparator thenComparing(Function keyExtractor, Comparator keyComparator) | 当调用this.compare(T o1, T o2)时o1和o2相等,上面的other比较器用以下步骤生成的比较器替代,该比较器符合以下步骤,先用keyExtractor处理o1,o2,再调用keyComparator比较处理后的值 |
| Comparator thenComparingInt(ToIntFunction keyExtractor) | 和上面 thenComparing(Function keyExtractor)差不多,只是 只不过ToIntFunction处理后得到的值是Int,然后两个Int相减 |
| Comparator thenComparingLong(ToLongFunction keyExtractor) | 和上面 thenComparing(Function keyExtractor)差不多,只不过ToLongFunction处理后得到的值是Long,则再两个Long相减 |
| Comparator thenComparingDouble(ToDoubleFunction keyExtractor) | 和上面 thenComparing(Function keyExtractor)差不多, 只不过ToDoubleFunction处理后得到的值是Double,则再两个Double相减 |
Comparator接口源码
package java.util; import java.io.Serializable; import java.util.function.Function; import java.util.function.ToIntFunction; import java.util.function.ToLongFunction; import java.util.function.ToDoubleFunction; import java.util.Comparators; @FunctionalInterface public interface Comparator{ int compare(T o1, T o2); boolean equals(Object obj); default Comparator reversed() { return Collections.reverseOrder(this); } default Comparator thenComparing(Comparator super T> other) { Objects.requireNonNull(other); return (Comparator & Serializable) (c1, c2) -> { int res = compare(c1, c2); return (res != 0) ? res : other.compare(c1, c2); }; } default Comparator thenComparing( Function super T, ? extends U> keyExtractor, Comparator super U> keyComparator) { return thenComparing(comparing(keyExtractor, keyComparator)); } default > Comparator thenComparing( Function super T, ? extends U> keyExtractor) { return thenComparing(comparing(keyExtractor)); } default Comparator thenComparingInt(ToIntFunction super T> keyExtractor) { return thenComparing(comparingInt(keyExtractor)); } default Comparator thenComparingLong(ToLongFunction super T> keyExtractor) { return thenComparing(comparingLong(keyExtractor)); } default Comparator thenComparingDouble(ToDoubleFunction super T> keyExtractor) { return thenComparing(comparingDouble(keyExtractor)); } public static > Comparator reverseOrder() { return Collections.reverseOrder(); } @SuppressWarnings("unchecked") public static > Comparator naturalOrder() { return (Comparator ) Comparators.NaturalOrderComparator.INSTANCE; } public static Comparator nullsFirst(Comparator super T> comparator) { return new Comparators.NullComparator<>(true, comparator); } public static Comparator nullsLast(Comparator super T> comparator) { return new Comparators.NullComparator<>(false, comparator); } public static Comparator comparing( Function super T, ? extends U> keyExtractor, Comparator super U> keyComparator) { Objects.requireNonNull(keyExtractor); Objects.requireNonNull(keyComparator); return (Comparator & Serializable) (c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2)); } public static > Comparator comparing( Function super T, ? extends U> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable) (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); } public static Comparator comparingInt(ToIntFunction super T> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable) (c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2)); } public static Comparator comparingLong(ToLongFunction super T> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable) (c1, c2) -> Long.compare(keyExtractor.applyAsLong(c1), keyExtractor.applyAsLong(c2)); } public static Comparator comparingDouble(ToDoubleFunction super T> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable) (c1, c2) -> Double.compare(keyExtractor.applyAsDouble(c1), keyExtractor.applyAsDouble(c2)); } }



