Java 8 如何知道排序时使用哪个 String::compareTo 方法引用?
How does Java 8 know which String::compareTo method reference to use when sorting?
Java 如何知道在调用 Collections.sort(someListOfStrings, String::compareTo);
时使用哪个 String::compareTo
方法引用? compareTo
不是静态的,它需要知道比较的 "left hand side" 的 value
。
好的,Collections.sort() 的源代码如下所示:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
我想现在已经很清楚了。内容是一个列表。这意味着它有一个顺序,并且按照该顺序一件一件地处理物品。
假设您使用 Comparator
接口的方法参考:
Comparator<String> cmp = String::compareTo;
当你调用cmp.compare(left, right)
(即Comparator
接口的"single abstract method"或"SAM")时,神奇的事情发生了:
int result = cmp.compare(left, right);
| |
/------------------------/ |
| /---------------/
| |
left.compareTo(right);
基本上SAM的所有参数都转换为引用方法的参数,但是this
对象(左边)也算作参数。
Java 如何知道在调用 Collections.sort(someListOfStrings, String::compareTo);
时使用哪个 String::compareTo
方法引用? compareTo
不是静态的,它需要知道比较的 "left hand side" 的 value
。
好的,Collections.sort() 的源代码如下所示:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
我想现在已经很清楚了。内容是一个列表。这意味着它有一个顺序,并且按照该顺序一件一件地处理物品。
假设您使用 Comparator
接口的方法参考:
Comparator<String> cmp = String::compareTo;
当你调用cmp.compare(left, right)
(即Comparator
接口的"single abstract method"或"SAM")时,神奇的事情发生了:
int result = cmp.compare(left, right);
| |
/------------------------/ |
| /---------------/
| |
left.compareTo(right);
基本上SAM的所有参数都转换为引用方法的参数,但是this
对象(左边)也算作参数。