Ответ
Аннотация @FunctionalInterface указывает, что интерфейс предназначен для использования в качестве целевого типа лямбда-выражения или ссылки на метод. Такой интерфейс должен содержать ровно один абстрактный метод (SAM — Single Abstract Method).
Основные преимущества:
- Проверка на уровне компиляции: Компилятор гарантирует, что интерфейс содержит только один абстрактный метод. Если добавить второй, возникнет ошибка.
- Ясность документации: Явно обозначает предназначение интерфейса для функционального программирования.
Пример:
@FunctionalInterface
interface StringProcessor {
String process(String input);
}
public class Main {
public static void main(String[] args) {
// Использование с лямбда-выражением
StringProcessor toUpper = s -> s.toUpperCase();
System.out.println(toUpper.process("hello")); // Выведет: HELLO
// Использование со ссылкой на метод
StringProcessor trimmer = String::trim;
System.out.println(trimmer.process(" text ")); // Выведет: text
}
}
Важно: Аннотация не является обязательной. Любой интерфейс с одним абстрактным методом по умолчанию считается функциональным, но @FunctionalInterface добавляет безопасность и ясность коду.