web-dev-qa-db-fra.com

Java stream sort 2 variables ascendant / descendant

Je veux trier seq1 en ordre croissant et seq2 en ordre décroissant, alors je fais ceci:

list = list.stream().sorted(comparing(AClass::getSeq1).thenComparing(        
   AClass::getSeq2).reversed()).collect(toList());

Mais le résultat sort car seq1 et seq2 sont triés par ordre décroissant.

Je peux le faire pour faire seq1 ascendant et seq2 descendant:

sorted(comparing(AClass::getSeq1)
   .reversed().thenComparing(AClass::getSeq2).reversed()

Quelle est vraiment la bonne façon de procéder?

19
Bruce

Dans votre premier exemple, reversed est appliqué à tout le comparateur qui compare seq1 puis seq2 dans l'ordre croissant.

Ce dont vous avez besoin, c'est d'inverser la deuxième comparaison uniquement, ce qui peut être fait, par exemple, avec:

import static Java.util.Collections.reverseOrder;
import static Java.util.Comparator.comparing;

list = list.stream().sorted(
                        comparing(AClass::getSeq1)
                       .thenComparing(reverseOrder(comparing(AClass::getSeq2))))
                       .collect(toList());


//or you could also write:

list = list.stream().sorted(
                        comparing(AClass::getSeq1)
                       .thenComparing(comparing(AClass::getSeq2).reversed()))
                       .collect(toList());
38
assylias