Java 8 - 使用比较器以不同的顺序比较多个字段

2022-09-05 00:33:53

我喜欢使用Java 8根据三个属性对对象进行排序。要求是按以下顺序排序 - 名称升序,年龄降序,城市升序。如果我在“年龄”上使用,它也会反转以前排序的条目。以下是我尝试过的:ComparatorListreversed()

Comparator.comparing((Person p) -> p.getName())
          .thenComparingInt(p -> p.getAge())
          .reversed()
          .thenComparing(p -> p.getCity());

答案 1

用:Comparator.reverseOrder()

.thenComparing(Person::getAge, Comparator.reverseOrder())

如果你想避免自动装箱,你可以做

.thenComparing((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()))

.thenComparing(Comparator.comparingInt(Person::getAge).reversed())

答案 2

无需使用比较器::反向方法。由于您要根据整数反转比较,因此只需否定年龄,它将按降序排序:-p.getAge()

Comparator.comparing((Person p) -> p.getName())
          .thenComparingInt(p -> -p.getAge())
          .thenComparing(p -> p.getCity());