Ответ
Прямая передача методов как аргументов в Java невозможна, но начиная с Java 8 эту задачу решают функциональные интерфейсы и лямбда-выражения.
Механизм:
- Создаётся функциональный интерфейс (интерфейс с одним абстрактным методом).
- Метод, принимающий этот интерфейс как параметр, может выполнить его единственный метод.
- При вызове вместо реализации интерфейса передаётся лямбда-выражение или ссылка на метод.
Пример с пользовательским интерфейсом:
@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 — ссылка на метод