Этот вопрос проверяет понимание критериев, по которым компилятор языка программирования (например, Java) определяет, что интерфейс может быть использован как основа для лямбда-выражений или ссылок на методы.
В языках, поддерживающих функциональное программирование (например, Java, начиная с версии 8), ключевым понятием является функциональный интерфейс. Это интерфейс, который содержит ровно один абстрактный метод. Именно наличие только одного абстрактного метода позволяет компилятору "понять", что данный интерфейс можно реализовать с помощью компактного лямбда-выражения, а не через громоздкий анонимный класс.
Компилятор проверяет следующие условия:
Object (например, toString, equals), не считаются абстрактными при подсчёте.Аннотация @FunctionalInterface является необязательной, но крайне полезной. Она выполняет две основные функции:
Рассмотрим пример корректного функционального интерфейса:
// Аннотация помогает компилятору проверить условие 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-коде:
filter, map, reduce.ExecutorService и CompletableFuture.Вывод: Функциональный интерфейс следует применять, когда необходимо определить единое действие или предикат, которое будет часто реализовываться через лямбда-выражения. Это основа для написания лаконичного и выразительного кода в парадигме функционального программирования в Java.
Уровень
Рейтинг:
4
Сложность:
3
Навыки
TypeScript
Java
Ключевые слова
Подпишись на Java Developer в телеграм