Ссылка на метод comparing java
Может кто нибудь объяснить почему выражение вида:
Comparator.comparing(Employee::getName);
вообще работает?метод comparing принимает функциональный интерфейс Function у которого метод apply принимает 1 аргумент.Почему ссылка на геттер getName который не принимает никаких аргументов вообще может быть присвоена Function?
Ответы (1 шт):
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.