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

Базовый Java
≈ 2 мин чтения

Когда lambda только вызывает готовый метод

Lambda часто не содержит новой логики, а просто передаёт аргумент уже существующему методу. В таком случае запись можно сделать короче с помощью ссылки на метод.

Function<String, Integer> length1 = text -> text.length();
Function<String, Integer> length2 = String::length;

Обе переменные описывают одно и то же поведение. Запись String::length не вызывает метод в момент объявления — она передаёт поведение, которое будет вызвано позже через функциональный интерфейс.

Основные формы ссылок

На практике чаще всего встречаются четыре формы:

Function<String, Integer> parse = Integer::parseInt;
Consumer<String> print = System.out::println;
Function<String, String> trim = String::trim;
Supplier<ArrayList<String>> create = ArrayList::new;
  • Integer::parseInt — ссылка на статический метод;
  • System.out::println — метод конкретного объекта;
  • String::trim — метод экземпляра, где сам объект будет передан как аргумент функционального интерфейса;
  • ArrayList::new — ссылка на конструктор.

Количество и типы параметров должны подходить ожидаемому функциональному интерфейсу. Например, String::trim подходит к Function<String, String>: входная строка становится объектом, у которого вызывается trim(), а результат метода становится результатом функции.

Выбирай читаемую форму

Ссылка на метод полезна, когда она действительно делает намерение очевиднее. Если lambda содержит дополнительную проверку, несколько вызовов или вычисление, обычная lambda обычно читается лучше.

Predicate<String> isNotBlank = text -> !text.isBlank();

Здесь попытка любой ценой заменить lambda ссылкой на метод только усложнила бы код. Ссылки на методы — это не отдельный механизм вычисления, а более компактная форма для уже существующего подходящего поведения.