list.stream().sort 可以用三个候选来做吗?



我已经成功地按以下实现排序,

如果"类别"字段等于,则比较"排序"字段,如果"类别"字段

不等于,则比较"id"字段。

List<Contact> originContactList = ...;
originContactList.sort((contact1, contact2) -> {
if (contact1.getCategory().compareTo(contact2.getCategory()) == 0) {
return contact1.getSort().compareTo(contact2.getSort());
} else {
return contact1.getId().compareTo(contact2.getId());
}
});

我想使用 java8 list.stream().sort 做与上面的代码相同的操作。可以吗?

如果"类别"字段

不等于,我不能这样做,然后比较"id"字段。

List<Contact> originContactList = ...;
originContactList.stream().sorted(
Comparator
.comparing(Contact::getCategory)
.thenComparingLong(Contact::getSort)
)
...

您也可以将第一个示例中的比较器用于流:

List<Contact> originContactList = ...;
originContactList.stream().sorted(
(contact1, contact2) -> {
if (contact1.getCategory().compareTo(contact2.getCategory()) == 0) {
return contact1.getSort().compareTo(contact2.getSort());
} else {
return contact1.getId().compareTo(contact2.getId());
}
})

但是:您编写的任何比较器都必须遵守一条基本规则:

如果它说从三个联系人contactAcontactBcontactCcontactA应该在contactB之前排序,contactB应该在contactC之前排序,那么它还必须contactA应该在contactC之前排序。

或者用Comparator.compare()的JavaDoc的话来说:

实现者还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0

使用比较器实现,很容易创建三个违反此规则的触点。

相关内容

  • 没有找到相关文章

最新更新