Java 流排序 2 个变量 ascending/desending

Java stream sort 2 variables ascending/desending

我想对 seq1 进行升序排序,seq2 进行降序排序,所以我这样做了:

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

但是出来的结果是seq1和seq2都是降序排列的

我可以这样做来使 seq1 升序和 seq2 降序:

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

真正正确的方法是什么?

在您的第一个示例中,reversed 应用于整个比较器,该比较器按升序比较 seq1 和 seq2。

你需要的是只反转第二个比较,这可以完成,例如:

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

代数观察:

在你的第一个例子中:(左结合)

comparing.thenComparing.reversed = (comparing.thenComparing).reversed

在你的第二个例子中:(reversed 的分配)

comparing.reversed.thenComparing.reversed 
= ((comparing.reversed).thenComparing).reversed
= ((comparing.reversed.reversed).(thenComparing.reversed))
= (comparing).(thenComparing.reversed)

这是稳定的,仍然总是给你想要的,但绝对不是正确的做法。

(这是注释,但格式太长)