Java 8如何知道在排序时使用哪个String :: compareTo方法引用?

sta*_*onk 9 java-8 method-reference

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

Tag*_*eev 13

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

Comparator<String> cmp = String::compareTo;
Run Code Online (Sandbox Code Playgroud)

当你调用cmp.compare(left, right)(这是接口的"单一抽象方法"或"SAM" Comparator)时,会产生魔力:

int result = cmp.compare(left, right);
                           |     |
  /------------------------/     |
  |              /---------------/
  |              |
left.compareTo(right);
Run Code Online (Sandbox Code Playgroud)

基本上SAM的所有参数都被转换为参考方法的参数,但是this对象(在左侧)也被计为参数.

  • 这称为*未绑定实例*方法引用. (7认同)
  • @stantonk,将`this`想象成另外一个参数,所以`public int compareTo(String anotherString)`就像`public static int compareTo(String this,String anotherString)`.通常在OOP语言内部它的工作方式如下:对象指针(引用)转换为函数/方法的第一个参数. (2认同)