Метод thenComparing
Метод thenComparing класса Comparator позволяет объединить
два компаратора в один составной компаратор. Сначала сравнение
выполняется текущим компаратором, и если элементы оказались
равными, то применяется второй компаратор. В первый параметр
мы передаем другой компаратор, во второй (необязательный) -
функцию извлечения ключа, по которому будет происходить
сравнение, а в третий (необязательный) - компаратор для
сравнения извлеченных ключей.
Синтаксис
comparator.thenComparing(otherComparator)
comparator.thenComparing(keyExtractor, [keyComparator])
Пример
Давайте отсортируем список чисел сначала по четности, а затем по возрастанию, если четность совпадает:
import java.util.Comparator;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(5, 2, 4, 1, 3);
Comparator<Integer> byEven = (a, b) -> Integer.compare(a % 2, b % 2);
Comparator<Integer> byValue = (a, b) -> Integer.compare(a, b);
List<Integer> res = list.stream()
.sorted(byEven.thenComparing(byValue))
.toList();
System.out.println(res);
}
}
Результат выполнения кода:
[2, 4, 1, 3, 5]
Пример
Давайте отсортируем список строк сначала по длине,
а затем по алфавиту с помощью компаратора, созданного
через comparing:
import java.util.Comparator;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "ab", "abc", "a", "abcd");
Comparator<String> comparator = Comparator
.comparing(String::length)
.thenComparing(Comparator.naturalOrder());
List<String> res = list.stream()
.sorted(comparator)
.toList();
System.out.println(res);
}
}
Результат выполнения кода:
[a, ab, abc, abcd, abcde]
Пример
Давайте отсортируем список строк по длине с помощью функции извлечения ключа, переданной вторым параметром:
import java.util.Comparator;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "ab", "abc", "a", "abcd");
Comparator<String> comparator = Comparator
.comparing(String::length)
.thenComparing(s -> s);
List<String> res = list.stream()
.sorted(comparator)
.toList();
System.out.println(res);
}
}
Результат выполнения кода:
[a, ab, abc, abcd, abcde]
Смотрите также
-
класс
Comparator,
который используется для сравнения объектов -
метод
comparing,
который создает компаратор по ключу -
метод
reversed,
который меняет порядок сортировки на обратный -
метод
naturalOrder,
который возвращает компаратор естественного порядка