使用Comparator的thenComparing实现多条件排序,先按年龄升序、分数降序、姓名升序排列,支持自定义逻辑与null安全处理。
在Java中对List进行多条件排序,可以通过Comparator接口结合Lambda表达式或方法引用来实现。从Java 8开始,Comparator提供了thenComparing()方法,可以方便地实现多个排序条件的叠加。
假设有一个Person类,包含姓名、年龄和分数字段,我们希望先按年龄升序,再按分数降序,最后按姓名字母顺序排列:
对List
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:
当字段可能为null时,应使用Comparator.nullsFirst()或nullsLast()避免空指针异常:
基本上就这些。利用Java 8的链式调用风格,多条件排序既简洁又可读性强,推荐优先使用Comparator.comparing()配合thenComparing()的方式实现。注意保持比较逻辑的一致性和可预测性,避免在运行时抛出异常。