J'utilise Java lambda pour trier une liste.
comment puis-je le trier de manière inverse?
J'ai vu ceci post , mais je veux utiliser Java 8 lambda.
Voici mon code (j'ai utilisé * -1) comme un hack
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());
Vous pouvez adapter la solution que vous avez liée en comment trier ArrayList <Long> en Java par ordre décroissant? en l’enveloppant dans un lambda:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
notez que f2 est le premier argument de Long.compare
, pas le second, ainsi le résultat sera inversé.
Si vos éléments de flux implémentent Comparable
alors la solution devient plus simple:
...stream()
.sorted(Comparator.reverseOrder())
Utilisation
Comparator<File> comparator = Comparator.comparing(File::lastModified);
Collections.sort(list, comparator.reversed());
Ensuite
.forEach(item -> item.delete());
Vous pouvez utiliser une référence de méthode:
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());
En alternative à la référence de la méthode, vous pouvez utiliser une expression lambda. L'argument de comparaison devient:
.sorted(comparing(file -> file.lastModified()).reversed());
Partage alternatif:
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());
Cela peut facilement être fait en utilisant Java 8 et en utilisant un inversé Comparateur .
J'ai créé une liste de fichiers à partir d'un répertoire, que j'affiche sans tri, trié et trié inversement à l'aide d'un simple comparateur pour le tri, puis en appelant reverse () dessus pour obtenir la version inversée de ce comparateur.
Voir le code ci-dessous:
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());
}
}
}
Trier la liste de fichiers avec Java 8 Collections
Exemple d'utilisation de Collections and Comparator Java 8 pour trier une liste de fichiers.
import Java.io.File;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;
import Java.util.List;
public class ShortFile {
public static void main(String[] args) {
List<File> fileList = new ArrayList<>();
fileList.add(new File("infoSE-201904270100.txt"));
fileList.add(new File("infoSE-201904280301.txt"));
fileList.add(new File("infoSE-201904280101.txt"));
fileList.add(new File("infoSE-201904270101.txt"));
fileList.forEach(x -> System.out.println(x.getName()));
Collections.sort(fileList, Comparator.comparing(File::getName).reversed());
System.out.println("===========================================");
fileList.forEach(x -> System.out.println(x.getName()));
}
}