反转Java 8中的比较器


74

我有一个ArrayList并想按降序对其进行排序。我用它的java.util.stream.Stream.sorted(Comparator)方法。这是根据Java API的描述:

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

这种方法给我一种升序排序。我应该更改哪个参数,以使其具有降序顺序?


2
当然,更改比较器行为。
duffymo

Answers:


151

您可以使用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

13

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

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

1
Comparator <SomeEntity> ENTITY_COMPARATOR = Comparator.comparing(SomeEntity :: getProperty1,reverseOrder())
庆焕


-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;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.