在 Java 8 中反转比较器

Reverse a comparator in Java 8

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

的描述

Returns a stream consisting of the elements of this stream, sorted according to the provided Comparator.

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

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

Java 8 Comparator 接口有一个 reversed 方法:https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#reversed--

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

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

为什么不扩展现有的比较器并覆盖 super 和 nor 结果。 Comperator Interface 的实现并不重要,但它使发生的事情更加清晰。

结果您得到了一个易于重用的 Class 文件、可测试的单元步骤和清晰的 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;
    }
}

我发现这个问题是在你有一个自定义比较器时搜索反转顺序并且反转是有条件的(你可以做也可以不做)。

匹诺曹提出的想法对我很有帮助

代码如下:

int order = requestedOrder.equals("asc") ? 1 : -1;

Collections.sort(List<CustomObj>, new Comparator<CustomObj>() {
    public int compare(CustomObj first, CustomObj scnd) {
        return first.getComparableParam().compareTo(scnd.getComparableParam()) * order;
    }
});

希望它对以后的其他人有所帮助