3 回答
TA贡献1810条经验 获得超4个赞
当您链接两种类型时,结果是预期的。
第一个 ( .sorted(Comparator.comparingInt(petition -> petition.getSignataires().size())) 按列表字段大小排序)。然后第二个 ( .sorted(Collections.reverseOrder())) 将第一个排序结果覆盖为最后一个按照 的逆自然顺序排序Petition。
当您两次调用排序流操作时,大致就像您使用了这个逻辑:
List<Petition> petitionList = ...;
// first sort
petitionList.sort(Comparator.comparingInt(petition -> petition.getSignataires().size());
// second sort
petitionList.sort(Collections.reversed());
您需要的是定义一个Comparator结合这些约束的实例。
从 Java 8 开始,您可以创建Comparators 并将它们组合起来,这主要归功于.thenComparingXXX()和.reversed()方法。
所以你可以这样做:
.sorted(Comparator.comparingInt(petition -> petition.getSignataires().size())
.reversed()
)
TA贡献1906条经验 获得超3个赞
您不需要两次sorted操作。它们不会被组合以产生结果Comparator.
第一个构造一个Comparator<Integer>forint size()值,而第二个则忽略前一个调用并应用它自己的Comparator<Petition>( Comparator.<Petition>reverseOrder())。
Comparator<Petition> reversedSignaturesSizeComparator
= Comparator.<Petition>comparingInt(p -> p.getSignataires().size()).reversed();
List<Petition> resultList = petitionList.stream()
.sorted(reversedSignaturesSizeComparator)
.collect(Collectors.toList());
TA贡献1874条经验 获得超12个赞
下面是使用 Collection 的其他重载方法的另一种方法,该方法使用自定义压缩器
Comparator<Petition> cmp =
(Petition left, Petition right) ->
left.getSignataires().size() - right.getSignataires().size();
List<Petition> resultList = petitionList.stream()
.sorted(Collections.reverseOrder(cmp))
.collect(Collectors.toList());
添加回答
举报