Запутался с использованием ссылки на метод в Comparator.comparing()

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

Почему это происходит? Пожалуйста, ответьте кому-нибудь, чтобы решить мою путаницу.


person Abisheak Sureshkumar    schedule 11.06.2021    source источник
comment
Я знаю, что абстрактный метод интерфейса Function должен принимать аргумент и возвращать значение Это либо неправильно, либо вы не совсем точно выражаете свои мысли. Runnable — это функциональный интерфейс, который не принимает аргумент и не возвращает значение.   -  person Michael    schedule 11.06.2021
comment
Я думаю, что ОП означает абстрактный метод интерфейса Function, и в этом случае они верны.   -  person SDJ    schedule 11.06.2021


Ответы (1)


В классе Movie getTitle() является методом экземпляра. Поэтому он принимает один аргумент, а именно аргумент типа Movie (неявный параметр). Чтобы вызвать метод getTitle(), вам нужен целевой объект:

movie.getTitle();

Здесь объект, на который ссылается movie, является одним аргументом.

Таким образом, тип функции getTitle() равен Movie -> String, что соответствует ожидаемому функциональному интерфейсу.

person SDJ    schedule 11.06.2021
comment
Итак, вы говорите, что всякий раз, когда мы ссылаемся на методы экземпляра, под капотом есть еще один аргумент? - person Abisheak Sureshkumar; 11.06.2021
comment
Всякий раз, когда вы вызываете метод экземпляра, существует неявный аргумент. - person SDJ; 11.06.2021