繁体   English   中英

Java 8:实现Comparable

[英]Java 8: implementing 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与Java SE 8?

您自己的选项2几乎肯定是目前最好的方式。 它避免了分配,它读得很好 - 特别是如果你把静态常量放在compareTo方法旁边。

Java 8中新的Comparator.comparing工厂方法非常容易阅读,甚至更好,很难搞砸 - 有很多很多方法可以手动编写比较错误,比我记忆中的更多,以及工厂方法对大多数人免疫。 尽管使用它们来编写compareTo方法而不是Comparator对象compareTo ,但它仍然比替代方案更好。

Pre-Java-8的一般最佳实践是使用GuavaComparisonChainOrdering实用程序。 它们抽象出了正确实现.compareTo() /。 .compare()方法的繁琐且容易出错的细节,并允许您编写一个人类可读的步骤序列来定义应如何比较对象。 Ordering实现Comparator ,但定义Ordering并在Comparable.compareTo()方法中调用它没有任何问题。

请注意,由于在Java 8中添加了JDK, Ordering被描述为已过时:

如果你使用的是Java 8,那么这个类现在已经过时了....它的大部分功能现在由StreamComparator本身提供,其余的现在可以在我们新的Comparators类中找到静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM