Collections.sort()适用于Comparable或Comparator?

时间:2016-03-14 01:47:06

标签: java generics

FragmentManager的以下重载究竟是什么:

  

Collections.sort()

要求作为第二个论点?

示例:我启动了7个随机整数的列表:

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

然后我尝试使用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()的签名完全不同。

2 个答案:

答案 0 :(得分:2)

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

因为方法引用只是lambda的语法糖,所以这里它们将如何转换为lambdas:

Integer::compare评估为

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

Integer::compareTo评估为

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

答案 1 :(得分:1)

getLocalURL

等同于旧Java中的此代码:

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

虽然

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。只是Java 8 lambdas将它隐藏起来。