Comment utiliser un Java8 lambda pour trier un flux dans l'ordre inverse?
Je suis en utilisant java lambda pour trier une liste.
comment puis-je trier dans le sens inverse?
J'ai vu ce post, mais je veux l'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());
- Qu'entendez-vous par "ordre inverse"? Si vous remplacez
-1 * answer
avecanswer
, la commande de changement à l'inverse de ce qu'il était avec-1 * ...
. - Méfiez-vous! Tout votre code suggère que vous souhaitez utiliser
forEachOrdered
au lieu deforEach
- pourquoi est-ce? pouvez-vous expliquer?
- Suivez les liens. Simplement dit,
forEachOrdered
, comme son nom l'indique, s'occupe de la rencontre de commande, ce qui est pertinent que vous voulez sauter un certain nombre de nouveau les fichiers qui s'appuie sur le “triées par date de modification de commande”. - Je ne suis pas entièrement l'obtenir. comme le
forEach
dans mon exemple qui se passe après laskip
. sens après mon filtre, je ne se soucient pas de l'ordre - Un peu en retard, je tiens à souligner que votre compréhension de la façon
sort
→skip
→(non ordonnée)forEach
devrait fonctionner, est correct et qu'il est en effet mis en place pour travailler de cette façon aujourd'hui, dans le Jre, mais de retour en 2015, lorsque les commentaires précédents ont été faits, il a été en effet un problème (comme vous pourrez le lire dans cette question).
Vous devez vous connecter pour publier un commentaire.
Vous pouvez adapter la solution que vous avez lié à Comment trier ArrayList<Long> en Java, dans l'ordre décroissant? en l'enveloppant dans un lambda:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
noter que f2 est le premier argument de
Long.compare
, pas la seconde, de sorte que le résultat sera inversé.Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
jette erreur de compilation:java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. Pourquoi?comparingLong(Long::valueOf).reversed()
à la place. OuCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
au lieu deObject
, sens le type d'objet ne doit pas être perdu. Mais en réalité il est. C'est ce que je suis confus au sujet de.comparingLong(Long::valueOf).reversed()
œuvres, de même explicitement tapé par l'expression lambda fonctionnecomparingLong((String v) -> Long.valueOf(v)).reversed()
œuvres. AussiStream.of("foo").mapToInt(s->s.length()).sum()
œuvres, comme le"foo"
fournit le type autonome alors queStream.of().mapToInt(s-> s.length()).sum()
échoue.reversed()
(voir les commentaires, et d'autres solutions). Heureux de transformer cela en un upvote si corrigée.Si votre flux éléments implémente
Comparable
alors la solution devient de plus simple:...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Utilisation
Puis
Vous pouvez utiliser une méthode de référence:
Dans la variante de la méthode de référence, vous pouvez utiliser une expression lambda, donc l'argument de la comparaison de devenir:
Autre moyen de partage:
ASC
DESC
Cela peut facilement être fait à l'aide de Java 8 et l'utilisation de l'inversion de la Comparateur.
J'ai créé une liste de fichiers d'un répertoire, qui, je l'affichage non triés, classés et inverse triés à l'aide d'un simple Comparateur pour les trier, puis en appelant inversé() sur elle pour obtenir la version inversée de ce Comparateur.
Voir code ci-dessous:
Trier la liste des fichiers avec java 8 Collections
Exemple, comment utiliser les Collections et Comparateur de Java 8 pour trier une liste de Fichiers.