Как использовать lambda Java8 для сортировки потока в обратном порядке?
Я использую java lambda для сортировки списка.
как я могу отсортировать его в обратном порядке?
Я видел этот пост, но я хочу использовать java 8 lambda.
Вот мой код (я использовал * -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());
Ответы
Ответ 1
Вы можете адаптировать решение, которое вы связали в Как отсортировать ArrayList <Long> в Java в порядке убывания?, обернув его в лямбда:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
заметим, что f2 является первым аргументом Long.compare
, а не вторым, поэтому результат будет отменен.
Ответ 2
Использование
Comparator<File> comparator = Comparator.comparing(File::lastModified);
Collections.sort(list, comparator .reversed());
Тогда
.forEach(item -> item.delete());
Ответ 3
BTW: если ваши элементы потока реализуют Comparable
, тогда это становится простым:
...stream()
.sorted(Comparator.reverseOrder())
Ответ 4
Вы можете использовать ссылку на метод:
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())
Ответ 5
Это можно легко сделать с помощью Java 8 и использования обратного Comparator.
Я создал список файлов из каталога, который я отображаю несортированными, отсортированными и обратными сортированными с помощью простого компаратора для сортировки, а затем вызывает обратный() на нем, чтобы получить обратную версию этого компаратора.
Смотрите код ниже:
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());
}
}
}
Ответ 6
Альтернативный способ совместного использования:
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());