Java中方法引用可简化Comparator,提升可读性:String::length等价于s->s.length();Person::getAge需配合public getter;null处理用nullsFirst/nullsLast;多级排序用thenComparing;reversed()实现逆序;构造器引用Person::new不适用。

Java 中用方法引用写 Comparator,能让排序逻辑更简洁、可读性更强,尤其适合按对象某个属性排序的场景。
用静态方法引用定义比较器
当比较逻辑已封装在静态方法中时,直接引用该方法即可。比如按字符串长度排序:
List<String> list = Arrays.asList("java", "python", "go", "javascript");
list.sort(String::compareTo); // 按字典序
list.sort(Comparator.comparingInt(String::length)); // 按长度升序
这里 String::length 就是方法引用,它等价于 s -> s.length(),被 comparingInt 用来提取比较键。
用实例方法引用按属性排序
对自定义对象按字段排序最常见。假设有类:
立即学习“Java免费学习笔记(深入)”;
class Person {
String name;
int age;
Person(String name, int age) { this.name = name; this.age = age; }
}
按年龄排序可写成:
List<Person> people = ...; people.sort(Comparator.comparingInt(Person::getAge));
前提是 Person 有 public 的 getter 方法(如 getAge())。方法引用 Person::getAge 会自动绑定每个 Person 实例并调用其 getAge() 方法。
处理 null 或多级排序时的注意事项
方法引用本身不处理 null,需配合空安全工具方法:
- 用 Comparator.nullsFirst(Person::getName) 或 nullsLast 显式指定 null 排序位置
- 链式调用实现多级排序:
Comparator.comparing(Person::getAge).thenComparing(Person::getName) - 逆序用 reversed():
Comparator.comparing(Person::getAge).reversed()
构造器引用不适用于 Comparator
注意:Person::new 是构造器引用,不能用于 Comparator。Comparator 要求接收一个参数并返回可比较的值(如 int、int、long、double),而构造器不满足这个签名。必须使用 getter、静态工具方法或 lambda 表达式来提取比较依据。


















