Я самообучающийся разработчик, сейчас изучаю Java. Я узнал, что для использования ссылки на метод для функционального интерфейса сигнатура метода, на который мы ссылаемся, должна совпадать с сигнатурой абстрактного метода внутри этого функционального интерфейса.
Но при изучении Comparator обнаружил, что метод Comparator.comparing() принимает интерфейс Function и возвращает Comparator. Я знаю, что абстрактный метод интерфейса Function должен принимать аргумент и возвращать значение.
но я могу передать любой метод (как ссылку на метод), который частично (не полностью) соответствует сигнатуре интерфейса функции методу сравнения() компаратора.
например, рассмотрим приведенный ниже пример.
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
. Но его можно использовать как ссылку на метод для интерфейса функции (которая принимает аргумент и возвращает значение).
Почему это происходит? Пожалуйста, ответьте кому-нибудь, чтобы решить мою путаницу.