栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Comparator源码总结 Comparator源码注释翻译和解析中英文对照版

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Comparator源码总结 Comparator源码注释翻译和解析中英文对照版

版本
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 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 keyExtractor,
            Comparator keyComparator)
    {
        return thenComparing(comparing(keyExtractor, keyComparator));
    }

    
    default > Comparator thenComparing(
            Function keyExtractor)
    {
        return thenComparing(comparing(keyExtractor));
    }

    
    default Comparator thenComparingInt(ToIntFunction keyExtractor) {
        return thenComparing(comparingInt(keyExtractor));
    }

    
    default Comparator thenComparingLong(ToLongFunction keyExtractor) {
        return thenComparing(comparingLong(keyExtractor));
    }

    
    default Comparator thenComparingDouble(ToDoubleFunction 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 comparator) {
        return new Comparators.NullComparator<>(true, comparator);
    }

    
    public static  Comparator nullsLast(Comparator comparator) {
        return new Comparators.NullComparator<>(false, comparator);
    }

    
    public static  Comparator comparing(
            Function keyExtractor,
            Comparator 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 keyExtractor)
    {
        Objects.requireNonNull(keyExtractor);
        return (Comparator & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }

    
    public static  Comparator comparingInt(ToIntFunction keyExtractor) {
        Objects.requireNonNull(keyExtractor);
        return (Comparator & Serializable)
            (c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));
    }

    
    public static  Comparator comparingLong(ToLongFunction keyExtractor) {
        Objects.requireNonNull(keyExtractor);
        return (Comparator & Serializable)
            (c1, c2) -> Long.compare(keyExtractor.applyAsLong(c1), keyExtractor.applyAsLong(c2));
    }

    
    public static Comparator comparingDouble(ToDoubleFunction keyExtractor) {
        Objects.requireNonNull(keyExtractor);
        return (Comparator & Serializable)
            (c1, c2) -> Double.compare(keyExtractor.applyAsDouble(c1), keyExtractor.applyAsDouble(c2));
    }
}

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号