comparator接口實現時,只需要實現 int compare(T o1, T o2)方法?


從Comparator接口的源碼,可以看到Comparator接口中的方法有三類:

1 普通接口方法

2 default方法

3 static方法

其中default方法和static方法 是java8新加的特性,default方法提供了方法實現,不強制接口實現類實現。static相較於default方法可以在直接用“接口名.方法名”調用。

那么,Comparator接口的實現類應該實現其中的comparator方法和equals方法。

但是,由於接口(接口可以看做一種特殊的類)以及該接口的實現類都默認繼承了Object類,在java代碼編譯為字節碼的過程后,實際上equals方法都已經被實現,編譯器也就不會認為Comparator接口的equals方法沒有實現。

另外,一般來講“接口是不能繼承類的”,實際嚴格來說是接口不能顯式地繼承類,並且不是想類的繼承那樣邏輯,接口會自動聲明public abstract的方法與Object中的public方法一一對應。

 

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<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);

    default Comparator<T> reversed() {

        return Collections.reverseOrder(this);

    }

    default Comparator<T> thenComparing(Comparator<? super T> other) {

        Objects.requireNonNull(other);

        return (Comparator<T> & Serializable) (c1, c2) -> {

            int res = compare(c1, c2);

            return (res != 0) ? res : other.compare(c1, c2);

        };

    }

    default <U> Comparator<T> thenComparing(

            Function<? super T, ? extends U> keyExtractor,

            Comparator<? super U> keyComparator)

    {

        return thenComparing(comparing(keyExtractor, keyComparator));

    }

    default <U extends Comparable<? super U>> Comparator<T> thenComparing(

            Function<? super T, ? extends U> keyExtractor)

    {

        return thenComparing(comparing(keyExtractor));

    }

    default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) {

        return thenComparing(comparingInt(keyExtractor));

    }

    default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor) {

        return thenComparing(comparingLong(keyExtractor));

    }

    default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) {

        return thenComparing(comparingDouble(keyExtractor));

    }

    public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {

        return Collections.reverseOrder();

    }

    @SuppressWarnings("unchecked")

    public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {

        return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;

    }

    public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {

        return new Comparators.NullComparator<>(true, comparator);

    }

    public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {

        return new Comparators.NullComparator<>(false, comparator);

    }

    public static <T, U> Comparator<T> comparing(

            Function<? super T, ? extends U> keyExtractor,

            Comparator<? super U> keyComparator)

    {

        Objects.requireNonNull(keyExtractor);

        Objects.requireNonNull(keyComparator);

        return (Comparator<T> & Serializable)

            (c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),

                                              keyExtractor.apply(c2));

    }

    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));

    }

    public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {

        Objects.requireNonNull(keyExtractor);

        return (Comparator<T> & Serializable)

            (c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));

    }

    public static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) {

        Objects.requireNonNull(keyExtractor);

        return (Comparator<T> & Serializable)

            (c1, c2) -> Long.compare(keyExtractor.applyAsLong(c1), keyExtractor.applyAsLong(c2));

    }

    public static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) {

        Objects.requireNonNull(keyExtractor);

        return (Comparator<T> & Serializable)

            (c1, c2) -> Double.compare(keyExtractor.applyAsDouble(c1), keyExtractor.applyAsDouble(c2));

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM