Ссылка на метод comparing java

Может кто нибудь объяснить почему выражение вида:

Comparator.comparing(Employee::getName);

вообще работает?метод comparing принимает функциональный интерфейс Function у которого метод apply принимает 1 аргумент.Почему ссылка на геттер getName который не принимает никаких аргументов вообще может быть присвоена Function?


Ответы (1 шт):

Автор решения: IR42

Function<T, R> - функциональный интерфейс (SAM - Single Abstract Method), с методом R apply(T t);, который принимает аргумент T и возвращает аргумент R. В переменную данного типа можно присвоить соответствующую функцию.

  // через лямда-выражение
  Function<Integer, Integer> sqr = (x) -> x * x;

  // через анонимный класс
  Function<Integer, Integer> sqr = new Function<Integer, Integer>() {
        @Override
        public Integer apply(Integer x) {
            return x * x;
        }
    };

Employee::getName - ссылка на метод, но так как это не статический метод, то его нужно вызывать на объекте класса. Так вот ссылка на метод может восприниматься как функция, принимающая объект класса, в котором происходит вызов данного метода.

Т.е. Function<Employee, String> employeeName = Employee::getName; тоже самое что и

Function<Employee, String> employeeName = (employee) -> employee.getName();

//или
Function<Employee, String> employeeName = new Function<Employee, String>() {
    @Override
    public String apply(Employee employee) {
        return employee.getName();
    }
};

Именно таким типом (Function<Employee, String>) и будет аргумент keyExtractor в методе comparing, при передаче в него ссылки Employee::getName.

→ Ссылка