Java 与在Comparator.comparing()中使用方法引用相混淆
我是一名自学型开发人员,现在正在学习Java。我了解到,要对函数接口使用方法引用,我们引用的方法的签名必须与该函数接口内抽象方法的签名相匹配 但在学习比较仪时,发现 “Comparator.comparating()”方法接受函数接口并返回一个比较器。 我知道函数接口的抽象方法必须接受一个参数并返回一个值。 但是我可以将部分(不完全)匹配函数接口签名的任何方法(作为方法引用)传递给Comparator的comparating()方法Java 与在Comparator.comparing()中使用方法引用相混淆,java,methods,comparator,method-reference,functional-interface,Java,Methods,Comparator,Method Reference,Functional Interface,我是一名自学型开发人员,现在正在学习Java。我了解到,要对函数接口使用方法引用,我们引用的方法的签名必须与该函数接口内抽象方法的签名相匹配 但在学习比较仪时,发现 “Comparator.comparating()”方法接受函数接口并返回一个比较器。 我知道函数接口的抽象方法必须接受一个参数并返回一个值。 但是我可以将部分(不完全)匹配函数接口签名的任何方法(作为方法引用)传递给Comparator的comparating()方法 例如,考虑下面的例子。 public class Movie
例如,考虑下面的例子。
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()));
}
}
这里,在排序的行中(Comparator.comparing(Movie::getTitle))
如您所见,getTitle()
方法不接受任何参数,并返回一个字符串。但是它可以用作函数接口的方法参考(它接受一个参数并返回一个值)
为什么会这样?请回答任何人以解决我的困惑。在类Movie
中,getTitle()
是一种实例方法。因此,它接受一个参数,即Movie
(隐式参数)类型的参数。要调用方法getTitle()
,您需要一个目标对象:
movie.getTitle();
这里,movie
引用的对象就是一个参数
因此,getTitle()
的函数类型是Movie->String
,它与预期的函数接口相匹配。“我知道函数接口的抽象方法必须接受一个参数并返回一个值”这可能是错误的,或者您没有准确地表达自己。是一个函数接口,它既不接受参数也不返回值。我认为OP表示接口的抽象方法,在这种情况下它们是正确的。所以,你是说每当我们引用实例方法时,都会有另一个参数隐藏在引擎盖下?每当你调用实例方法时,都会有一个隐式参数。