我已经成功地按以下实现排序,
如果"类别"字段等于,则比较"排序"字段,如果"类别"字段不等于,则比较"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());
}
})
但是:您编写的任何比较器都必须遵守一条基本规则:
如果它说从三个联系人contactA
,contactB
和contactC
contactA
应该在contactB
之前排序,contactB
应该在contactC
之前排序,那么它还必须说contactA
应该在contactC
之前排序。
或者用Comparator.compare()
的JavaDoc的话来说:
实现者还必须确保关系是可传递的:
((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0
使用比较器实现,很容易创建三个违反此规则的触点。