sort(Comparator.comparing
时间: 2025-01-14 19:36:45 浏览: 21
Java Comparator.comparing
排序示例及用法
在Java中,Comparator.comparing
是一种用于创建比较器的方法,该方法允许基于对象的一个属性进行自然顺序排序或自定义排序逻辑。
使用 Comparator.comparing
对列表中的对象按单个字段排序
假设有一个表示人的类 Person
:
class Person {
private String name;
private int age;
// Constructors, getters and setters omitted for brevity
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
现在要按照年龄对这些人进行升序排列,可以这样做:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("John", 28),
new Person("Jane", 22),
new Person("Jim", 34)
);
List<Person> sortedPeople = people.stream()
.sorted(Comparator.comparing(Person::getAge))
.collect(Collectors.toList());
System.out.println(sortedPeople);
}
}
这段代码会输出如下结果[^1]:
[Person{name='Jane', age=22}, Person{name='John', age=28}, Person{name='Jim', age=34}]
多重条件下的排序
当需要根据多个标准来决定最终的顺序时,比如先按名字再按年龄排序,可以通过链式调用来实现这一点:
List<Person> multiSortedPeople = people.stream()
.sorted(Comparator.comparing(Person::getName).thenComparing(Person::getAge))
.collect(Collectors.toList());
这将首先依据姓名字母表顺序排序;如果有相同的名字,则进一步依照年龄大小排序。
自定义比较方式
有时默认的行为可能不符合需求,这时可以在传递给 comparing
方法之前应用映射函数来自定义键提取过程。例如,忽略字符串的大写差异来进行不区分大小写的名称排序:
List<Person> caseInsensitiveSort = people.stream()
.sorted(Comparator.comparing(p -> p.getName().toLowerCase()))
.collect(Collectors.toList());
或者直接提供一个实现了 Function<T,R>
的 lambda 表达式作为参数,其中 T 是输入类型而 R 是输出/比较的关键字类型。
相关推荐


















