如何通过Comparator.comparing()链式调用实现基于多个字段的复合排序?
- 内容介绍
- 相关推荐
本文共计757个文字,预计阅读时间需要4分钟。
直接使用`thenComparing`方法进行连续比较,而不是重复调用`comparing`方法。许多人错误地以为需要写成`comparing(a).comparing(b).comparing(c)`,这样做会导致编译失败。正确的做法是使用`thenComparing`,它会返回一个新的`Comparator`,而不是重复调用`comparing`方法。因此,正确的写法是:
正确链路是:一个 comparing() 打头,后面全用 thenComparing()(或其变体)追加:
Comparator<User> cmp = Comparator.comparing(User::getAge) .thenComparing(User::getName) .thenComparing(User::getId);
字符串字段排序时 null 值怎么不抛 NullPointerException?
comparing() 默认对 null 敏感,只要某个对象的比较字段为 null,运行时就抛 NullPointerException。这不是 bug,是设计行为。
本文共计757个文字,预计阅读时间需要4分钟。
直接使用`thenComparing`方法进行连续比较,而不是重复调用`comparing`方法。许多人错误地以为需要写成`comparing(a).comparing(b).comparing(c)`,这样做会导致编译失败。正确的做法是使用`thenComparing`,它会返回一个新的`Comparator`,而不是重复调用`comparing`方法。因此,正确的写法是:
正确链路是:一个 comparing() 打头,后面全用 thenComparing()(或其变体)追加:
Comparator<User> cmp = Comparator.comparing(User::getAge) .thenComparing(User::getName) .thenComparing(User::getId);
字符串字段排序时 null 值怎么不抛 NullPointerException?
comparing() 默认对 null 敏感,只要某个对象的比较字段为 null,运行时就抛 NullPointerException。这不是 bug,是设计行为。

