java方法引用可简化comparator排序逻辑,如person::getname替代lambda;支持null安全处理、多级链式排序及自定义比较逻辑,提升代码简洁性与可维护性。

Java 中方法引用可以简化对象属性的比较逻辑,尤其配合 Comparator 使用时,代码更简洁、可读性更高。
用方法引用替代 Lambda 表达式
传统写法中,按某个属性排序需写 Lambda:
list.sort((a, b) -> a.getName().compareTo(b.getName()));
改用方法引用后更直观:
list.sort(Comparator.comparing(Person::getName));
这里 Person::getName 就是方法引用,等价于“取每个 Person 对象的 name 属性进行自然排序”。
处理 null 值:避免空指针异常
若属性可能为 null,直接用 Comparator.comparing 会抛出 NullPointerException。推荐用带 null 处理的变体:
-
Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo))—— null 排在最后 -
Comparator.comparing(Person::getName, Comparator.nullsFirst(String::compareTo))—— null 排在最前
也可用 Comparator.nullsLast(Comparator.naturalOrder()) 等组合方式,灵活适配业务场景。
多级排序:链式调用方法引用
需要先按年龄升序、再按姓名降序时,可链式组合:
list.sort(Comparator.comparing(Person::getAge)
.thenComparing(Person::getName, Comparator.reverseOrder()));
每个 thenComparing 后仍支持方法引用,保持风格统一,也便于维护。
自定义比较逻辑:结合方法引用与静态/实例方法
当属性本身不支持直接比较(如时间戳、枚举或复杂对象),可封装逻辑到工具方法,再用方法引用调用:
- 静态方法:
Comparator.comparing(Person::getBirthDate, DateUtils::compareByYear) - 实例方法:
Comparator.comparing(person -> person.getScore(), Score::compareTo)(注意此处不能直接用方法引用,因需先获取 score 实例)
关键点是:方法引用左侧必须是类型明确的对象,右侧是无参且返回可比类型的函数式方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











