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获取更多资讯