Получить доступ

Что такое функциональный интерфейс?

JuniorЛямбды и Stream APIJava >=8
Ещё спрашивают так:
  • Что такое @FunctionalInterface?
  • Как связаны лямбды и функциональные интерфейсы?
  • Какие стандартные функциональные интерфейсы вы знаете?
Коротко

Функциональный интерфейс — интерфейс ровно с одним абстрактным методом (SAM); лямбда и ссылка на метод — его реализация.

  • default- и static-методы не считаются
  • @FunctionalInterface необязательна, но компилятор проверит, что метод один

А ещё Стандартные: Function, Predicate, Supplier, Consumer, BiFunction, UnaryOperator

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Лямбда в Java не является самостоятельным типом: компилятор превращает её в реализацию интерфейса, у которого ровно один абстрактный метод. Такой интерфейс называют функциональным (SAM — single abstract method). Runnable, Comparator, Callable — функциональные.

Default- и static-методы в счёт не идут, поэтому Comparator с десятком default-методов остаётся функциональным. Методы, совпадающие с методами Object (equals), тоже не считаются.

Аннотация @FunctionalInterface не обязательна, но полезна: если кто-то добавит второй абстрактный метод, код перестанет компилироваться, а не сломаются лямбды в других местах.

Стандартные интерфейсы из java.util.function:

  • Function<T, R> — преобразовать T в R;
  • Predicate<T> — проверить условие;
  • Supplier<T> — поставить значение;
  • Consumer<T> — принять значение и что-то сделать;
  • BiFunction, UnaryOperator, BinaryOperator и версии для примитивов (IntPredicate и т. д.).

Пример

@FunctionalInterface
interface Discount {
    double apply(double price);
    default Discount andThen(Discount next) { return p -> next.apply(apply(p)); }
}

Discount tenPercent = p -> p * 0.9;
Predicate<String> notBlank = s -> !s.isBlank();
Function<String, Integer> length = String::length;

Что хотят услышать

  • Определение: ровно один абстрактный метод.
  • default и static не считаются.
  • Роль аннотации @FunctionalInterface.
  • Связь с лямбдами и стандартные интерфейсы.

Частые ошибки

  • Считать, что default-метод лишает интерфейс «функциональности».
  • Думать, что @FunctionalInterface обязательна для лямбды.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Интерфейс ровно с одним абстрактным методом (SAM); default- и static-методы не в счёт. @FunctionalInterface даёт проверку компилятором
  • ✗Интерфейс без методов (маркерный)
  • ✗Интерфейс, у которого все методы статические
  • ✗Любой интерфейс с аннотацией @Override

Что спросят дальше

  • Назови стандартные функциональные интерфейсы из java.util.function.
  • Зачем примитивные специализации (IntPredicate)?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем