Как использовать Java8 лямбда для сортировки потока в обратном порядке?
Я использую java lambda для сортировки списка.
Как я могу отсортировать его в обратную сторону?
Я видел этот post, но я хочу использовать 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());
6 ответов:
вы можете адаптировать решение, которое вы связали в как сортировать ArrayList
в Java в порядке убывания? обернув его в лямбда:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
отметим, что f2 это первый аргумент
Long.compare
, а не второй, поэтому результат будет обратным.
кстати: если ваш поток элементов реализует
Comparable
потом это стало просто:...stream() .sorted(Comparator.reverseOrder())
использовать
Comparator<File> comparator = Comparator.comparing(File::lastModified); Collections.sort(list, comparator .reversed());
затем
.forEach(item -> item.delete());
Вы можете использовать ссылки на метод:
import static java.util.Comparator.*; import static java.util.stream.Collectors.*; Arrays.asList(files).stream() .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName())) .sorted(comparing(File::lastModified).reversed()) .skip(numOfNewestToLeave) .forEach(item -> item.delete());
в альтернативе ссылки на метод вы можете использовать лямбда-выражение, поэтому аргумент сравнения становится:
.sorted(comparing(file -> file.lastModified()).reversed());
альтернативный способ обмена:
ASC
List<Animal> animals = this.service.findAll(); animals = animals.stream().sorted(Comparator.comparing(Animal::getName)).collect(Collectors.toList());
DESC
List<Animal> animals = this.service.findAll(); animals = animals.stream().sorted(Comparator.comparing(Animal::getName).reversed()).collect(Collectors.toList());
Это можно легко сделать с помощью Java 8 и использование обратного компаратор.
Я создал список файлов из каталога, который я показываю несортированным, отсортированным и обратным сортированным с помощью простого компаратора для сортировки, а затем вызываю reversed() на нем, чтобы получить обратную версию этого компаратора.
посмотреть код ниже:
package test; import java.io.File; import java.util.Arrays; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.stream.Collectors; public class SortTest { public static void main(String... args) { File directory = new File("C:/Media"); File[] files = directory.listFiles(); List<File> filesList = Arrays.asList(files); Comparator<File> comparator = Comparator.comparingLong(File::lastModified); Comparator<File> reverseComparator = comparator.reversed(); List<File> forwardOrder = filesList.stream().sorted(comparator).collect(Collectors.toList()); List<File> reverseOrder = filesList.stream().sorted(reverseComparator).collect(Collectors.toList()); System.out.println("*** Unsorted ***"); filesList.forEach(SortTest::processFile); System.out.println("*** Sort ***"); forwardOrder.forEach(SortTest::processFile); System.out.println("*** Reverse Sort ***"); reverseOrder.forEach(SortTest::processFile); } private static void processFile(File file) { try { if (file.isFile()) { System.out.println(file.getCanonicalPath() + " - " + new Date(file.lastModified())); } } catch (Exception e) { System.out.println(e.getMessage()); } } }