Как в Java передать метод в качестве аргумента другому методу?

«Как в Java передать метод в качестве аргумента другому методу?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Прямая передача методов как аргументов в Java невозможна, но начиная с Java 8 эту задачу решают функциональные интерфейсы и лямбда-выражения.

Механизм:

  1. Создаётся функциональный интерфейс (интерфейс с одним абстрактным методом).
  2. Метод, принимающий этот интерфейс как параметр, может выполнить его единственный метод.
  3. При вызове вместо реализации интерфейса передаётся лямбда-выражение или ссылка на метод.

Пример с пользовательским интерфейсом:

@FunctionalInterface
interface Operation {
    int execute(int a, int b);
}

class Calculator {
    static int calculate(Operation op, int x, int y) {
        return op.execute(x, y); // Вызов переданной операции
    }
}

// Использование с лямбдой:
int sum = Calculator.calculate((a, b) -> a + b, 5, 3); // 8
int product = Calculator.calculate((a, b) -> a * b, 5, 3); // 15

Стандартные функциональные интерфейсы (java.util.function): Для типичных случаев используйте готовые интерфейсы:

  • Function<T, R> — принимает T, возвращает R.
  • Consumer<T> — принимает T, не возвращает значения (void).
  • Supplier<T> — не принимает аргументов, возвращает T.
  • Predicate<T> — принимает T, возвращает boolean.

Пример со ссылкой на метод:

List<String> names = Arrays.asList("Anna", "Bob", "Charlie");
names.forEach(System.out::println); // System.out::println — ссылка на метод