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>
这里 String::length 就是方法引用,它等价于 s -> s.length(),被 comparingInt 用来提取比较键。
用实例方法引用按属性排序
对自定义对象按字段排序最常见。假设有类:
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>
前提是 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 表达式来提取比较依据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











