Java 8 : implementing Comparable

标签 java java-8 comparator comparable

我喜欢 Comparator 的新静态工厂方法,因为它们允许以非常简洁且不易出错的方式实现比较器。

但是实现Comparable的推荐方法是什么?我们应该在 Comparable 实现中使用 Comparators 吗?

public MyClass implements Comparable<MyClass>{
...
    public int compareTo(MyClass other){
        Comparator<MyClass> naturalOrderComparator = 
            Comparator.comparing(MyClass::getFoo)
                      .thenComparing(MyClass::getBar);
        return naturalOrderComparator.compare(this, other);
    } 
}

甚至在对大型集合进行排序时使用静态比较器来减少大量对象创建:

public MyClass implements Comparable<MyClass>{
    private static final Comparator<MyClass> NATURAL_ORDER_COMPARATOR =     
        Comparator.comparing(MyClass::getFoo)
                  .thenComparing(MyClass::getBar);

    ...

    public int compareTo(MyClass other){
        return NATURAL_ORDER_COMPARATOR.compare(this, other);
    } 
}

或者是否有另一种推荐的方法来实现 Comparable with Java SE 8?

最佳答案

您自己的选项 2 几乎可以肯定是当前可用的最佳方式。它避免了分配,读起来非常好——尤其是当您将静态常量放在 compareTo 方法旁边时。

Java 8 中新的 Comparator.comparing 工厂方法非常容易阅读,更棒的是,很难搞砸——有很多很多方法可以手工编写不正确的比较,更多比我想记住的要多,而且工厂方法对其中的大多数是免疫的。尽管使用它们来编写 compareTo 方法而不是 Comparator 对象有点奇怪,但它仍然比替代方案更好。

关于Java 8 : implementing Comparable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46286383/

相关文章:

Java - Thymeleaf - HTML : Color letters using switch case: Unwanted paragraph/newline

Java 8 Streams 多重分组依据

java - Arrays.sort 和 Arrays.parallelSort 函数行为

java - 如何删除ArrayList中的对象?

java - 使用 Java Comparator 自定义排序 - 保留具有特定值的对象的位置

java - 在 Bash 中自动安装需要多次按键的 Java 应用程序

java - 读取服务器上的文件

Java 文件列表未使用比较器排序

java - 如何在 xsd 文件中指定架构位置?

java - 测试在 TestFX 上通过,但在 headless 模式下未通过