Как отсортировать List по двум полям одновременно?
Существует List - Список чатов. Для каждого пользователя этот список уникален.Каждый чат для пользователя может быть закреплён или не закреплён. Список отсортирован по дате последнего сообщения в чатах.
Как помимо сортировки даты добавить ещё сортировку по полю isPin? isPin - это boolean значение.
P.S. Сначала выводятся сообщения isPin - true, отсортированные по дате, а после : isPin - false и так же отсортированные по дате.
Ответы (2 шт):
Как-то так:
sortedList = persons.stream()
.sorted(Comparator.comparing(Post::isPin)
.thenComparing(Post::date));
.collect(Collectors.toList());
Если первая сортировка выполняется по булевому полю в порядке true / false, то она выполняется в обратном порядке (reversed()), затем вызывается компаратор для сортировки по полю даты, которая также скорей всего должна выполняться в обратном порядке:
List<Chat> chats = ... //
chats.sort(Comparator
// по убыванию isPin
.comparing(Chat::isPin, Comparator.reverseOrder())
// по убыванию времени последнего сообщения
.thenComparing(Chat::getLastMessageTimestamp, Comparator.reverseOrder())
);
Аналогичного результата можно добиться при помощи менее многословного Comparator.reversed(), применив его к списку, отсортированному в прямом порядке по обоим полям:
chats.sort(Comparator
// по возрастанию isPin (false before true)
.comparing(Chat::isPin)
// по возрастанию времени последнего сообщения
.thenComparing(Chat::getLastMessageTimestamp)
.reversed()
);