对在 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
,与预期的函数接口相匹配。
我是一名自学开发者,现在正在学习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
,与预期的函数接口相匹配。