Вопрос проверяет понимание назначения аннотации @FunctionalInterface в Java, которая маркирует интерфейсы, предназначенные для использования в лямбда-выражениях.
В Java 8 была введена концепция функциональных интерфейсов для поддержки лямбда-выражений и функционального программирования. Функциональный интерфейс — это интерфейс, который содержит ровно один абстрактный метод (так называемый SAM — Single Abstract Method). Аннотация @FunctionalInterface используется для явного обозначения таких интерфейсов.
Главная цель — документация и проверка на уровне компилятора. Когда вы помечаете интерфейс этой аннотацией, компилятор проверяет, действительно ли он содержит только один абстрактный метод. Если вы попытаетесь добавить второй абстрактный метод, компиляция завершится с ошибкой, что предотвращает случайные изменения, которые сломали бы существующие лямбда-выражения.
Рассмотрим простой функциональный интерфейс для операции сложения:
@FunctionalInterface
interface Adder {
int add(int a, int b);
// Допустимы default или static методы
default void printResult(int result) {
System.out.println("Result: " + result);
}
}
public class Main {
public static void main(String[] args) {
// Использование с лямбда-выражением
Adder adder = (x, y) -> x + y;
System.out.println(adder.add(5, 3)); // Вывод: 8
}
}Функциональные интерфейсы широко используются в Stream API, многопоточности (например, Runnable, Callable) и различных библиотеках, где требуется передача поведения в виде лямбда-выражений. Стандартная библиотека Java включает множество предопределённых функциональных интерфейсов в пакете java.util.function (например, Function, Predicate, Consumer).
Вывод: Аннотацию @FunctionalInterface стоит применять, когда вы создаёте интерфейс, предназначенный специально для лямбда-выражений, чтобы обеспечить безопасность типов и явно выразить намерение в коде.