在Java 8中反转比较器

时间:2015-10-07 14:53:18

标签: java sorting java-8 comparator java-stream

我有一个ArrayList,并希望按降序排序。我用它java.util.stream.Stream.sorted(Comparator)方法。以下是根据Java API的描述:

  

返回由此流的元素组成的流,并根据提供的Comparator进行排序。

这个方法按升序返回给我。我应该更改哪个参数,只是为了降序?

4 个答案:

答案 0 :(得分:75)

您可以使用Comparator.reverseOrder()让比较器反转自然顺序。

如果要反转现有比较器的顺序,可以使用Comparator.reversed()

示例代码:

Stream.of(1, 4, 2, 5)
    .sorted(Comparator.reverseOrder()); 
    // stream is now [5, 4, 2, 1]

Stream.of("foo", "test", "a")
    .sorted(Comparator.comparingInt(String::length).reversed()); 
    // stream is now [test, foo, a], sorted by descending length

答案 1 :(得分:6)

答案 2 :(得分:1)

您也可以使用Comparator.comparing(Function, Comparator)
必要时链接比较器很方便,例如:

Comparator<SomeEntity> ENTITY_COMPARATOR = comparing(SomeEntity::getProperty1, reverseOrder())
        .thenComparingInt(SomeEntity::getProperty2)
        .thenComparing(SomeEntity::getProperty3, reverseOrder());

答案 3 :(得分:-2)

为什么不扩展现有的编译器并覆盖super和结果。 编译器接口的实现不是必需的,但可以使事情更加清楚。

因此,您将获得一个易于重用的类文件,可测试的单元步骤并清除javadoc。

public class NorCoperator extends ExistingComperator implements Comparator<MyClass> {
    @Override
    public int compare(MyClass a, MyClass b) throws Exception {
        return super.compare(a, b)*-1;
    }
}