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对象(左边)也算作参数。