对在 Comparator.comparing() 中使用方法引用感到困惑

Confused with using method reference in Comparator.comparing()

我是一名自学开发者,现在正在学习Java。我了解到,要为功能接口使用方法引用,我们引用的方法的签名必须与该功能接口中抽象方法的签名相匹配

但是在学习Comparator的过程中,发现 “Comparator.comparing()”方法采用 Function 接口和 returns 比较器。 我知道Function接口的抽象方法必须有一个参数和return一个值

但我可以将部分(不完全)匹配函数接口的签名的任何方法(作为方法参考)传递给比较器的比较()方法。

例如考虑下面的例子。

public class Movie {
private  String title;
private int likes;

public Movie(String title, int likes) {
    this.title = title;
    this.likes = likes;
}

public String getTitle(){
    return title;
}

public int getLikes() {
    return likes;
}
}

import java.util.Comparator;
import java.util.List;

public class Main {
public static void main(String[] args) {     
    var movies=List.of(
      new Movie("b", 20),
      new Movie("c", 30),
      new Movie("a", 10));

    var stream=movies.stream().
    sorted(Comparator.comparing(Movie::getTitle));  
    stream.forEach(m->System.out.println(m.getLikes()));
  }
}

这里,在行sorted(Comparator.comparing(Movie::getTitle))

如您所见,getTitle() 方法不带任何参数,return是一个 String。但它可以 用作方法参考 函数接口(它接受一个参数和 return 一个值).

为什么会这样?请大家解答一下,解决我的困惑。

在classMovie中,getTitle()是实例方法。因此它接受一个参数,即 Movie 类型的参数(隐式参数)。要调用方法 getTitle(),您需要一个目标对象:

movie.getTitle();

这里movie引用的对象就是那个参数。

因此getTitle()的函数类型是Movie -> String,与预期的函数接口相匹配。