J'utilise java lambda pour trier une liste.
comment puis-je le trier de manière inversée?
J'ai vu ce 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());
java
lambda
java-8
java-stream
Elad Benda2
la source
la source
-1 * answer
paranswer
, l'ordre changera pour inverser ce qu'il était avec-1 * ...
.forEachOrdered
place deforEach
forEachOrdered
comme son nom l' indique, soins sur ordre de rencontre qui est pertinent que vous voulez sauter un certain nombre de nouveaux fichiers qui repose sur le « trié par date de modification » ordre .sort
→skip
→ (non ordonné)forEach
devrait fonctionner, est correcte et qu'elle est effectivement implémentée pour fonctionner de cette manière dans les JRE d'aujourd'hui, mais en 2015, lorsque les commentaires précédents ont été faits, il était en effet un problème (comme vous pouvez le lire dans cette question ).Réponses:
Vous pouvez adapter la solution que vous avez liée dans 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, donc le résultat sera inversé.la source
Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
plaids la compilation d' erreur:java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. Pourquoi?comparingLong(Long::valueOf).reversed()
place. OuCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
au lieu deObject
, ce qui signifie que le type d'objet ne devrait pas être perdu. Mais en fait c'est le cas. C'est de cela que je suis confus.comparingLong(Long::valueOf).reversed()
fonctionne, de même une expression lambda explicitement typée fonctionnecomparingLong((String v) -> Long.valueOf(v)).reversed()
fonctionne. Fonctionne égalementStream.of("foo").mapToInt(s->s.length()).sum()
, car le"foo"
fournit le type autonome alors qu'ilStream.of().mapToInt(s-> s.length()).sum()
échoue.Si vos éléments de flux implémentent,
Comparable
la solution devient plus simple:la source
...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Comparable
.Collections.reverse
n'a pas une telle restriction.Utilisation
ensuite
la source
Vous pouvez utiliser une référence de méthode:
En alternative à la référence de méthode, vous pouvez utiliser une expression lambda, donc l'argument de comparaison devient:
la source
Partage alternatif:
ASC
DESC
la source
Cela peut facilement être fait en utilisant Java 8 et l'utilisation d'un comparateur inversé .
J'ai créé une liste de fichiers à partir d'un répertoire, que j'affiche non triés, triés et triés à l'envers à 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:
la source
Trier la liste de fichiers avec les collections Java 8
Exemple d'utilisation de Collections et Comparator Java 8 pour trier une liste de fichiers.
la source
En simple, en utilisant Comparator et Collection, vous pouvez trier comme ci-dessous dans l' ordre inverse en utilisant JAVA 8
la source
Pour le tri inversé, changez simplement l'ordre de x1, x2 pour appeler la méthode x1.compareTo (x2), le résultat sera inversé.
Ordre par défaut
Ordre inverse
la source