Java 8:实现Comparable

时间:2017-09-18 18:58:29

标签: java java-8 comparator comparable

我喜欢ex.array <- array(dim = c(3,3,3)) ex.array[,,1] <- c("N","A","","1","0","N","A","","1") ex.array[,,2] <- c("0","N","A","","1","0","N","A","") ex.array[,,3] <- c("1","0","N","A","","1","0","N","A") desired.array <- array(dim = c(3,3,3)) desired.array[,,1] <- c(NA,NA,NA,1,0,NA,NA,NA,1) desired.array[,,2] <- c(0,NA,NA,NA,1,0,NA,NA,NA) desired.array[,,3] <- c(1,0,NA,NA,NA,1,0,NA,NA) ex.array desired.array 的新静态工厂方法,因为它们允许以非常简洁且不易出错的方式实现比较器。

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

Comparable

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

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);
    } 
}

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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

  

如果你使用的是Java 8,那么这个类现在已经过时了......它的大多数功能现在由StreamComparator本身提供,其余的现在可以被发现为静态新Comparators课程中的方法。