10

Java 如何知道String::compareTo调用时使用哪个方法引用Collections.sort(someListOfStrings, String::compareTo);compareTo不是静态的,它需要知道value比较的“左侧”。

4

2 回答 2

15

假设您使用Comparator接口的方法引用:

Comparator<String> cmp = String::compareTo;

当您调用cmp.compare(left, right)(即Comparator接口的“单一抽象方法”或“SAM”)时,神奇的事情发生了:

int result = cmp.compare(left, right);
                           |     |
  /------------------------/     |
  |              /---------------/
  |              |
left.compareTo(right);

基本上SAM的所有参数都转换为引用方法的参数,但是thisobject(在左侧)也算作参数。

于 2015-09-06T04:08:10.073 回答
0

OK,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]);
   }
}

我想现在已经很清楚了。内容是一个列表。这意味着它有一个订单,并且项目按该顺序一一处理。

于 2015-09-05T23:14:12.713 回答