2016-03-14 29 views
-1

到底是什么的Collections.sort()以下过载:Collections.sort()适用于Comparable或Comparator?

sort(List<T> list, Comparator<? super T> c)

的要求作为第二个参数?


例子:我开始为7个随机整数的列表:

List<Integer> listOfInts = new ArrayList<>(); 
Random rand = new Random(System.currentTimeMillis()); 
for (int i = 0; i < 7; i++) { 
    listOfInts.add(rand.nextInt()); 
} 

然后我尝试使用Collections.sort()作为对它们进行排序:

Collections.sort(listOfInts, Integer :: compare); 

还有:

Collections.sort(listOfInts, Integer :: compareTo); 

它们都是工作。 为什么不使用compareTo()排序集合的调用会抛出/失败?compareTo()的签名与compare()的签名完全不同。

+0

http://stackoverflow.com/questions/420223/what-is-the-difference-between-compare-and-compareto – msadler

+0

我认为你会对Java 8中引入的lambdas有些困惑。尝试在Java 7中你将能够轻松看到它。 –

+0

@msadler:给出相同答案的方法与方法相同。 'compare'比较两件事物,而在一件事物上调用'compareTo'来比较另一件事物。我已经在我的问题的最后一行提到了它。无论如何,谢谢你在这里链接这个答案。我在发布这个问题之前阅读了它,但它很好地链接了它。 – displayName

回答

1
Collections.sort(listOfInts, Integer::compare); 

是相当于旧Jav中的这段代码答:

Collections.sort(list, new Comparator<Integer>() { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     return Integer.compare(o1, o2); 
    } 
}); 

虽然

Collections.sort(listOfInts, Integer::compareTo); 

相当于

Collections.sort(list, new Comparator<Integer>() { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     return o1.compareTo(o2); 
    } 
}); 

这里没有超载。方法sort需要第二个参数为Comparator。它只是Java 8 lambda,它将它隐藏起来。

+0

你的回答对我有意义。如果可能的话,你能否详细说明lambda *实际上是如何隐藏它的?没有问题,如果你不能。 – displayName

+0

@displayName它们完全按照上图所示隐藏它。你输入'Integer :: compare',但它实际上创建了一个新的Comparator(),它的'compareTo(Integer o1,Integer o2)'方法的实现是'return Integer.compare(o1,o2);' –

2

您正在使用method references两种类型。第一个是reference to a static method。第二个是reference to a type instance method。自动装箱后,它们都具有相同的功能签名(Integer, Integer) -> int

由于方法的引用都只是为了lambda表达式语法糖,这里是他们如何转化为lambda表达式:

Integer::compare评估为

(int left, int right) -> Integer.compare(left, right) 

Integer::compareTo评估为

(Integer left, Integer right) -> left.compareTo(right) 
+0

您的回答部分阐明了这一点。我不明白具有不同签名的两种方法如何被接受以对数据产生相同的效果?在进一步评论你的答案之前,会阅读自动装箱。 – displayName

+0

@displayName查看我的更新 – shmosel

+0

希望我能两次投票。谢谢你的解释。你的回答很清楚。 – displayName

相关问题