Ответ
Функциональный интерфейс — это интерфейс, который содержит ровно один абстрактный метод (SAM — Single Abstract Method). Он может содержать любое количество default или static методов. Аннотация @FunctionalInterface является необязательной, но явно указывает на назначение интерфейса и позволяет компилятору проверить это условие.
Пример объявления и использования:
@FunctionalInterface
interface MathOperation {
int execute(int a, int b); // Единственный абстрактный метод
default void printResult(int result) { // default-метод допустим
System.out.println("Result: " + result);
}
}
// Реализация с помощью лямбда-выражения:
MathOperation addition = (x, y) -> x + y;
int sum = addition.execute(5, 3); // 8
// Реализация с помощью ссылки на метод:
MathOperation multiply = Math::multiplyExact; // Если есть подходящий статический метод
Зачем это нужно? Функциональные интерфейсы — это основа для лямбда-выражений и ссылок на методы в Java. Они широко используются в Stream API и других API, требующих передачи поведения.
Стандартные функциональные интерфейсы из java.util.function:
Function<T, R>— принимает T, возвращает R.Predicate<T>— принимает T, возвращаетboolean.Consumer<T>— принимает T, не возвращает ничего (void).Supplier<T>— не принимает аргументов, возвращает T.