Интерфейс стратегии сортировки коллекции Java Comparator

Spring Boot Java

1. Введение

Недавно использованная сортировка коллекций (на основе Java 8). теперь я могу использоватьStreamпросто используйтеStream, такой ароматный! Сортировку можно записать так:

List<People> peoples = new ArrayList<>();
  // 中间省略
  // 按照年龄从小到大排序
peoples.sort(Comparator.comparing(People::getAge));

Здесь сортировка использует ключевой интерфейсjava.util.Comparator. Сортировка и сравнение — частое требование в бизнесе, и нам необходимо изучить этот интерфейс.

2. Концепция компаратора

Comparatorэто функциональный интерфейс. Он часто используется для сортировки коллекций, которые не имеют естественного порядка, напримерCollections.sortилиArrays.sort. Или объявить правила упорядочения для некоторых упорядоченных структур данных, таких какTreeSet,TreeMap. Этот интерфейс в основном используется для сортировки коллекции.

3. Методы компаратора

ComparatorПоскольку функциональный интерфейс имеет только один абстрактный метод, но у него много методов по умолчанию, давайте познакомимся с этими методами.

3.1 Сравнительный абстрактный метод

так какComparatorединственный абстрактный метод,int compare(T o1,T o2)Сравните размер двух параметров и верните отрицательное целое число, ноль и положительное целое число, представляющееo1<o2,o1=o2,o1>o2, которые обычно возвращаются соответственно-1,0или1. Псевдовыражение:

// 输入两个同类型的对象 ,输出一个比较结果的int数字
(x1,x2)-> int

Для реализации этого метода необходимо обратить внимание на следующее:

  • Должно быть гарантированоcompare(x,y)а такжеcompare(y,x)Сумма значений должна быть0.
  • Отношение порядка сравнения должно быть гарантировано транзитивным, еслиcompare(x,y)>0а такжеcompare(y,z)>0ноcompare(x,z)>0.
  • если он существуетcompare(x,y)=0, то дляzс точки зрения существованияcompare(x, z)==compare(y, z).

Однако строго не требуется(compare(x, y)==0) == (x.equals(y)). В общем, любая реализация Comparator, нарушающая это условие, должна явно указывать этот факт.

3.2 Сравнение методов рядов

отJava 8Начинать,ComparatorПредоставляет серию статических методов и придает им функциональный стиль.ComparatorБолее мощные и удобные функции мы будем называтьcomparingметод серии.

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

Этот метод является основным из этой серии методов. Это сложно понять? Проанализируем этот метод. Он имеет всего два параметра, которые являются функциональными интерфейсами.

первый параметрFunction<? super T, ? extends U> keyExtractorУказывает, что вводTвведите объект, выведитеUобъект типа, например, введитеPeopleобъект возвращает свой возрастIntegerСтоимость:

//   people -> people.getAge(); 转换为下面方法引用
Function<People, Integer> getAge = People::getAge;

второй параметрkeyComparatorЭто легко понять, указав используемые правила сравнения.

правильноc1,c2По первому параметруkeyExtractorПредоставлены правила для извлечения признаков, затем второй параметрkeyComparatorСравните эти две функции. Следующая формула фактически может быть резюмирована как3.1из(x1,x2)-> int

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

Comparator & Serializable — новые функции Java 8: удовлетворяют ограничениям обоих типов.

После понимания этого метода другие методы из этой серии становятся понятными и не будут повторяться здесь. В настоящее времяcomparingПоследовательные методы более широко используются. Давайте дадим несколько примеров:

List<People> peoples = new ArrayList<>();
//  ………………
// 按照年龄从低到高排序
peoples.sort(Comparator.comparing(People::getAge));
// 按照年龄从高到低排序
peoples.sort(Comparator.comparing(People::getAge, (x, y) -> -x.compareTo(y)));

Точно так же вы можете использоватьjava.util.CollectionsилиStreamпредоставленный метод сортировки для использованияComparator.

4. Резюме

Да, сегодняComparatorВыполняется простой анализ, который используется для построения правил сортировки коллекций, что очень полезно в повседневной разработке. Следующая статья Мы рассмотрим еще один интерфейс, очень похожий на негоComparableОставайтесь с нами, чтобы проанализировать и сравнить их различия.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn