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()
的签名完全不同。
答案 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将它隐藏起来。