17370845950

在Java中如何对List进行多条件排序
使用Comparator的thenComparing实现多条件排序,先按年龄升序、分数降序、姓名升序排列,支持自定义逻辑与null安全处理。

在Java中对List进行多条件排序,可以通过Comparator接口结合Lambda表达式或方法引用来实现。从Java 8开始,Comparator提供了thenComparing()方法,可以方便地实现多个排序条件的叠加。

使用 thenComparing 实现多条件排序

假设有一个Person类,包含姓名、年龄和分数字段,我们希望先按年龄升序,再按分数降序,最后按姓名字母顺序排列:

// 定义 Person 类 class Person { private String name; private int age; private double score; public Person(String name, int age, double score) { this.name = name; this.age = age; this.score = score; } // getter 方法 public String getName() { return name; } public int getAge() { return age; } public double getScore() { return score; } @Override public String toString() { return name + "(" + age + ", " + score + ")"; } }

对List进行多条件排序:

import java.util.*; List people = Arrays.asList( new Person("Alice", 25, 85.0), new Person("Bob", 20, 90.0), new Person("Charlie", 25, 95.0), new Person("David", 20, 85.0) ); people.sort(Comparator .comparing(Person::getAge) // 年龄升序 .thenComparing(Person::getScore, Comparator.reverseOrder()) // 分数降序 .thenComparing(Person::getName) // 姓名升序 ); people.forEach(System.out::println);

输出结果为:

David(20, 85.0) Bob(20, 90.0) Alice(25, 85.0) Charlie(25, 95.0)

自定义比较器逻辑

如果需要更复杂的比较逻辑,可以在comparing()中传入自定义的Comparator

people.sort(Comparator .comparing(Person::getAge) .thenComparing(p -> -p.getScore()) // 负号实现降序 .thenComparing(p -> p.getName().length()) // 按名字长度排序 );

处理 null 值的安全排序

当字段可能为null时,应使用Comparator.nullsFirst()nullsLast()避免空指针异常:

people.sort(Comparator .comparing(Person::getName, Comparator.nullsFirst(String::compareTo)) .thenComparing(Person::getAge) );

基本上就这些。利用Java 8的链式调用风格,多条件排序既简洁又可读性强,推荐优先使用Comparator.comparing()配合thenComparing()的方式实现。注意保持比较逻辑的一致性和可预测性,避免在运行时抛出异常。