Для чего используется аннотация @FunctionalInterface в Java?

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

Ответ

Аннотация @FunctionalInterface указывает, что интерфейс предназначен для использования в качестве целевого типа лямбда-выражения или ссылки на метод. Такой интерфейс должен содержать ровно один абстрактный метод (SAM — Single Abstract Method).

Основные преимущества:

  1. Проверка на уровне компиляции: Компилятор гарантирует, что интерфейс содержит только один абстрактный метод. Если добавить второй, возникнет ошибка.
  2. Ясность документации: Явно обозначает предназначение интерфейса для функционального программирования.

Пример:

@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 добавляет безопасность и ясность коду.