Я настоятельно рекомендую вам не путать ссылки на методы с лямбдами. Лямбды являются их собственной темой для обсуждения и не полностью зависят от ссылок на методы.
Так уж получилось, что с помощью ссылок на методы мы можем удалить множество шаблонов, потому что ссылки на методы предоставляют синтаксический сахар.
Например, предположим, что мне нужна функция, которая принимает два параметра разных типов (скажем, String и Integer), и я хочу, чтобы она выводила String.
BiFunction<String, Integer, String> func = (s, i) -> s.substring(i);
Вместо этого я мог бы переписать это со ссылками на метод, поскольку существует метод, который соответствует этой сигнатуре.
BiFunction<String, Integer, String> func = String::substring;
Если бы я хотел соответствовать другой подписи, я должен был бы создать свою собственную @FunctionalInterface
, чтобы выполнить это.
@FunctionalInterface
interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
Ссылки на методы просто уменьшают шаблон работы с лямбдами. Если метод соответствует сигнатуре вашей лямбды, вы можете использовать ее вместо лямбда-выражения.