我正试图创建一个方法,通过制作来对列表进行排序
private List<Processor> getByPriority(){
return processors.stream().sorted( new ProcessorComparator() ).collect( Collectors.toList() );
}
但我在Comprator javadoc中读到,与之相比,需要一个总的排序关系。也就是说,没有两个比较器可以具有相同的优先级,除非它们相等。事实可能并非如此。
我在尝试这个简单的比较器:
public class ProcessorComparator implements Comparator<TTYMessageProcessor<?>>{
@Override
public int compare( Processor processor1 , Processor processor2 ) {
return processor1.getPriority() - processor2.getPriority();
}
}
当然,我可以使处理器具有可比性,但我希望避免对所有处理器进行修改。难道没有任何方法可以将它们与流进行排序吗?作为替代方案,我可以编写自己的方法或创建一个更复杂的比较器,但我对缺乏更优雅的解决方案感到惊讶。
读取引用时,保留原始流的元素:
返回一个流,该流由该流的元素组成,并根据提供的Comparator进行排序。
不会收回、删除或复制任何元素。和进去的元素一样,只是重新排序。
编辑:文档还说明了Comparator.compare
通常情况下但不是严格要求(compare(x,y) ==0)==(x.equals(y))。一般来说,任何比较器违反这个条件应该清楚地表明这个事实。这个建议使用的语言是"注意:此比较器强制排序不一致。"
当在地图或集合中使用时,这可能会导致对equals
的混淆:
使用能够强制使用与equals不一致的排序对排序集进行排序(或已排序的地图)。假设一个具有显式比较器c与从集合S中提取的元素(或键)一起使用。如果c对S的排序与equals不一致,排序集合(或已排序的映射)的行为会"奇怪"。特别是已排序的集合(或已排序的映射)将违反集合(或map),这是根据相等来定义的。
如果您将Comparator
视为键值对的抽象,则可以消除混淆:如果两个对的键相等,则不会期望它们相等。这只是意味着这些值的某些属性(即它们的键)被认为是相似的。如果您希望一个对象以与equals
一致的方式成为Comparable
,那么最好实现名称相同的接口Comparable。