Middle
57
questionbank

Что ты знаешь о функциональных интерфейсах в Java 8 и более поздних версиях?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Функциональный интерфейс — это интерфейс, содержащий только один абстрактный метод. Он может иметь любое количество default или static методов.

Применение:

  • Позволяют использовать лямбда-выражения и ссылки на методы.
  • Являются основой Stream API.
  • Описывают контракты для функционального программирования в Java.

Примеры встроенных функциональных интерфейсов (пакет java.util.function):

  • Consumer<T>: Принимает аргумент, ничего не возвращает (void accept(T t)).
  • Supplier<T>: Ничего не принимает, возвращает значение (T get()).
  • Predicate<T>: Принимает аргумент, возвращает булево значение (boolean test(T t)).
  • Function<T, R>: Принимает аргумент типа T, возвращает значение типа R (R apply(T t)).
  • UnaryOperator<T>: Наследник Function<T, T>, принимает и возвращает значение одного типа (T apply(T t)).
  • BinaryOperator<T>: Наследник BiFunction<T, T, T>, принимает два значения одного типа и возвращает значение того же типа (T apply(T t1, T t2)).

Аннотация @FunctionalInterface:

  • Опциональна, но рекомендуется использовать.
  • Позволяет компилятору проверить, является ли интерфейс действительно функциональным (имеет только один абстрактный метод).

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

java

Пример использования с лямбда-выражением:

java

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