Java 8:实现Comparable

Puc*_*uce 8 java comparable comparator java-8

我喜欢新的静态工厂方法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);
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*man 6

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

Comparator.comparingJava 8中的新工厂方法非常容易阅读,甚至更好,很难搞砸 - 手动编写比较的方法有很多种,比我记忆中的要多,而且工厂方法不受影响其中大部分.尽管使用它们编写compareTo方法而不是Comparator对象有点奇怪,但它仍然比替代方案更好.

  • 只有两件事需要关注.1.)工厂生产的比较器不能保护您不会产生与平等不一致的逻辑,因此,您仍需要关注.2.)你必须抵制创建零安全比较器的诱惑.虽然比较器可以为"null"值提供正式的正确逻辑,但是由于契约需要对称性,因此不能比较,因此`equivalentInstance.compareTo(null)`必须抛出异常,就像`(null).compareTo(equivalentInstance)一样.将. (2认同)