Я использую Java-лямбду для сортировки списка.
как я могу отсортировать его в обратном порядке?
Я видел этот пост , но я хочу использовать Java 8 лямбда.
Вот мой код (я использовал * -1) как взломать
Arrays.asList(files).stream()
.filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
.sorted(new Comparator<File>() {
public int compare(File o1, File o2) {
int answer;
if (o1.lastModified() == o2.lastModified()) {
answer = 0;
} else if (o1.lastModified() > o2.lastModified()) {
answer = 1;
} else {
answer = -1;
}
return -1 * answer;
}
})
.skip(numOfNewestToLeave)
.forEach(item -> item.delete());
java
lambda
java-8
java-stream
Elad Benda2
источник
источник
-1 * answer
наanswer
, порядок изменится на обратный-1 * ...
.forEachOrdered
вместоforEach
forEachOrdered
как следует из названия, заботится о порядке столкновения , которая имеет отношение , как вы хотите , чтобы пропустить определенное количество новых файлов, опирающиеся на «отсортированный по времени модификации» порядка .sort
→skip
→ (неупорядоченный)forEach
должен работать, правильно и что оно действительно реализовано для работы таким образом в сегодняшних JRE, но еще в 2015 году, когда были сделаны предыдущие комментарии, оно была действительно проблема (как вы можете прочитать в этом вопросе ).Ответы:
Вы можете адаптировать решение, которое вы связали в Как отсортировать ArrayList <Long> в Java в порядке убывания? завернув его в лямбду:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
обратите внимание, что f2 является первым аргументом
Long.compare
, а не вторым, поэтому результат будет обратным.источник
Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
бросками компиляции ошибка:java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. Зачем?comparingLong(Long::valueOf).reversed()
вместо этого. ИлиCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
а неObject
означает, что тип объекта не должен быть потерян. Но на самом деле это так. Вот что меня смущает.comparingLong(Long::valueOf).reversed()
Работает, аналогично лямбда-выражению с явной типизацией работаетcomparingLong((String v) -> Long.valueOf(v)).reversed()
работает. ТакжеStream.of("foo").mapToInt(s->s.length()).sum()
работает, так как"foo"
обеспечивает автономный тип, тогда какStream.of().mapToInt(s-> s.length()).sum()
не работает.Если ваши элементы потока реализуются,
Comparable
то решение становится проще:источник
...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Comparable
.Collections.reverse
не имеет такого ограничения.использование
затем
источник
Вы можете использовать ссылку на метод:
В качестве альтернативы ссылки на метод вы можете использовать лямбда-выражение, поэтому аргументом сравнения становится:
источник
Альтернативный способ обмена:
ASC
DESC
источник
Это легко сделать с помощью Java 8 и обратного компаратора .
Я создал список файлов из каталога, который я отображаю несортированными, отсортированными и отсортированными в обратном порядке, используя простой Comparator для сортировки, а затем вызывая reversed () для него, чтобы получить обратную версию этого Comparator.
Смотрите код ниже:
источник
Сортировка списка файлов с коллекциями java 8
Пример использования Коллекций и Компаратора Java 8 для сортировки списка файлов.
источник
Проще говоря, используя Comparator и Collection, вы можете сортировать, как показано ниже, в обратном порядке, используя JAVA 8
источник
Для обратной сортировки просто измените порядок x1, x2 для вызова метода x1.compareTo (x2), результат будет обратным друг другу
Порядок по умолчанию
Обратный порядок
источник