Что такое функциональный интерфейс?
- Что такое @FunctionalInterface?
- Как связаны лямбды и функциональные интерфейсы?
- Какие стандартные функциональные интерфейсы вы знаете?
Функциональный интерфейс — интерфейс ровно с одним абстрактным методом (SAM); лямбда и ссылка на метод — его реализация.
- default- и static-методы не считаются
- @FunctionalInterface необязательна, но компилятор проверит, что метод один
А ещё Стандартные: Function, Predicate, Supplier, Consumer, BiFunction, UnaryOperator
Подробно
Лямбда в 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 обязательна для лямбды.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Интерфейс ровно с одним абстрактным методом; default и static не в счёт
- ✗Интерфейс с @FunctionalInterface, у которого все методы статические
- ✗Интерфейс без методов (маркерный)
- ✗Любой интерфейс с аннотацией @Override
Что спросят дальше
- Назови стандартные функциональные интерфейсы из java.util.function.
- Зачем примитивные специализации (IntPredicate)?
Разбор темы
- Лямбды и функциональные интерфейсы
SAM-интерфейсы, лямбда против анонимного класса, замыкания и effectively final, ссылки на методы и стандартные интерфейсы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.