为什么Comparator.comparing()方法分开thenComparing()会导致排序失败
时间: 2024-10-19 12:03:40 浏览: 21
`Comparator.comparing()` 和 `thenComparing()` 是 Java 中用于自定义集合排序的工具方法,它们通常一起使用来构建复合比较规则。当你只使用 `comparing()` 方法时,它会按照指定属性对元素进行基本排序。但如果后续还想添加额外的排序依据,应该使用 `thenComparing()`。
如果直接在一次调用中将所有条件都放在 `.comparing()` 中,比如:
```java
List<MyObject> list = ...;
list.sort(Comparator.comparing(MyObject::getProperty1)
.thenComparing(MyObject::getProperty2));
```
然而你却分成了两步:
```java
list.sort(Comparator.comparing(MyObject::getProperty1));
list.sort(Comparator.comparing(MyObject::getProperty2));
```
这样做会导致两个独立的排序操作被执行,实际上并不会形成复合排序,因为排序链被中断了。每个排序操作都会覆盖前一个的操作结果,所以最终的结果可能是错误的,特别是当第二个属性的数据不足以确定顺序时。
正确的做法是合并这两个步骤,让 `thenComparing()` 负责关联上一个已排序的列表:
```java
list.sort(Comparator.comparing(MyObject::getProperty1)
.thenComparing(MyObject::getProperty2));
```
阅读全文