Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про TypeScript: functional interface, lambda expression, single abstract method, SAM, @FunctionalInterface

Как компилятор понимает, что интерфейс является функциональным?

Этот вопрос проверяет понимание критериев, по которым компилятор языка программирования (например, Java) определяет, что интерфейс может быть использован как основа для лямбда-выражений или ссылок на методы.

Короткий ответ

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

Длинный ответ

В языках, поддерживающих функциональное программирование (например, Java, начиная с версии 8), ключевым понятием является функциональный интерфейс. Это интерфейс, который содержит ровно один абстрактный метод. Именно наличие только одного абстрактного метода позволяет компилятору "понять", что данный интерфейс можно реализовать с помощью компактного лямбда-выражения, а не через громоздкий анонимный класс.

Критерии функционального интерфейса

Компилятор проверяет следующие условия:

  • Интерфейс должен содержать ровно один абстрактный метод (метод без реализации).
  • При этом интерфейс может содержать любое количество методов по умолчанию (default methods) с реализацией.
  • Интерфейс может содержать любое количество статических методов.
  • Методы, унаследованные от класса Object (например, toString, equals), не считаются абстрактными при подсчёте.

Роль аннотации @FunctionalInterface

Аннотация @FunctionalInterface является необязательной, но крайне полезной. Она выполняет две основные функции:

  1. Проверка на этапе компиляции: Если разработчик пометил интерфейс этой аннотацией, но интерфейс не соответствует критерию SAM, компилятор выдаст ошибку. Это предотвращает случайные изменения, которые могут нарушить функциональность лямбда-выражений.
  2. Документирование кода: Аннотация явно указывает другим разработчикам на предназначение интерфейса.

Примеры кода

Рассмотрим пример корректного функционального интерфейса:

// Аннотация помогает компилятору проверить условие SAM
@FunctionalInterface
interface StringProcessor {
    // Единственный абстрактный метод
    String process(String input);
    
    // Метод по умолчанию — разрешён
    default void log(String msg) {
        System.out.println("LOG: " + msg);
    }
    
    // Статический метод — разрешён
    static boolean isEmpty(String s) {
        return s == null || s.trim().isEmpty();
    }
}

// Использование с лямбдой
StringProcessor toUpper = (str) -> str.toUpperCase();
System.out.println(toUpper.process("hello")); // Выведет: HELLO

Пример интерфейса, который НЕ является функциональным (вызовет ошибку компиляции с аннотацией):

@FunctionalInterface // ОШИБКА компиляции: несколько абстрактных методов
interface InvalidProcessor {
    void methodA();
    void methodB(); // Второй абстрактный метод нарушает условие SAM
}

Где применяются функциональные интерфейсы

Функциональные интерфейсы широко используются в современном Java-коде:

  • В Streams API для операций filter, map, reduce.
  • В многопоточности с ExecutorService и CompletableFuture.
  • В обработке событий и в библиотеках, таких как JavaFX.
  • Для создания чистых, декларативных и переиспользуемых блоков поведения.

Вывод: Функциональный интерфейс следует применять, когда необходимо определить единое действие или предикат, которое будет часто реализовываться через лямбда-выражения. Это основа для написания лаконичного и выразительного кода в парадигме функционального программирования в Java.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • TypeScript

    TypeScript

  • Java

    Java

Ключевые слова

#functional interface

#lambda expression

#single abstract method

#SAM

#@FunctionalInterface

Подпишись на Java Developer в телеграм