问题描述
我是一名自学开发者,现在正在学习 Java。我了解到要对函数式接口使用方法引用,我们引用的方法的签名必须与该函数式接口内的抽象方法的签名相匹配。
但是在学习 Comparator 的时候,发现 “Comparator.comparing()”方法采用Function接口并返回一个Comparator。 我知道Function接口的抽象方法必须接受一个参数并返回一个值。
但我可以将部分(不完全)匹配 Function 接口的签名的任何方法(作为方法引用)传递给 Comparator 的 compare() 方法。
例如考虑下面的例子。
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()
方法不接受任何参数并返回一个 String
。但它可以用作函数接口(接受一个参数并返回一个值)的方法引用。
为什么会这样?请回答任何人以解决我的困惑。
解决方法
在类 Movie
中,getTitle()
是一个实例方法。因此它需要一个参数,即 Movie
类型的参数(隐式参数)。要调用方法 getTitle()
,您需要一个目标对象:
movie.getTitle();
这里 movie
引用的对象就是那个参数。
getTitle()
的函数类型因此是 Movie -> String
,与预期的函数接口匹配。