2015-05-21 7 views
12

Ich möchte absteigend seq1 aufsteigend und seq2 sortieren, so mache ich das:Java Stream Art 2 Variablen aufsteigend/desending

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

Aber das Ergebnis kommen, da beide seq1 und seq2 sind in absteigender Reihenfolge sortiert.

Ich kann dies tun, um seq1 auf- und absteigendes seq2 zu machen:

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

Was ist wirklich der richtige Weg, dies zu tun?

+0

In Zukunft bitte Ihre 'Import static' Aussagen liefern. – aaiezza

Antwort

21

In Ihrem ersten Beispiel wird reversed auf den gesamten Komparator angewendet, der seq1 und seq2 in aufsteigender Reihenfolge vergleicht.

Was Sie brauchen, ist den zweiten Vergleich nur umkehren, was getan werden kann, zum Beispiel mit:

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()); 
+0

Wow! Es gibt mehr als eine Möglichkeit, das Problem zu lösen. Vielen Dank! – Bruce

+11

['.thenComparing (AClass :: getSeq2, reverseOrder())'] (http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparing-java.util. function.Function-java.util.Comparator-) ist ebenfalls möglich und wird hinsichtlich der Quellcodelänge (was für ein knappes Match) der Gewinner sein ... – Holger

+2

Danke für das Hinzufügen der 'import static' Statements. Sie hätten wirklich in der Frage sein sollen ... – aaiezza