如何在Java中先按属性升序再按另一属性降序排序对象列表?
实现先按属性升序、再按另一属性降序的排序
你当前的问题在于调用了整个比较器链的reversed()方法——这个操作会把整条排序规则完全反转,包括原本的age升序也变成了降序,所以才得到不符合预期的结果。
要实现「age升序,name降序」的需求,只需要单独反转第二个属性的比较规则即可,有两种简洁的实现方式:
方式一:对第二个属性的比较器单独反转
直接在thenComparing中传入一个已反转的name比较器:
var sortedPeople = people .stream() .sorted( Comparator .comparing(Person::getAge) // age升序 .thenComparing(Comparator.comparing(Person::getName).reversed()) // name降序 ) .toList();
方式二:使用thenComparing的重载方法
利用thenComparing的重载版本,直接传入属性提取函数和反向比较器:
var sortedPeople = people .stream() .sorted( Comparator .comparing(Person::getAge) // age升序 .thenComparing(Person::getName, Comparator.reverseOrder()) // name降序 ) .toList();
运行修改后的代码,就能得到你想要的结果:
(25, David), (25, Bob), (25, Alice), (30, Eve), (30, Charlie)
为什么原来的代码不行?
你之前的代码是先构建了「age升序 → name升序」的比较器链,再调用reversed(),这会把整条规则反转,变成「age降序 → name降序」,自然不符合需求。而上面两种方法都只针对第二个属性的排序规则做反转,第一个属性的升序规则保持不变。
内容的提问来源于stack exchange,提问作者rasitayaz
相关产品推荐
相关产品推荐

