Вопрос проверяет понимание различий между обычным и функциональным интерфейсами в Java, что важно для работы с лямбда-выражениями и функциональным программированием.
В Java интерфейс — это контракт, который определяет набор методов. Обычный интерфейс может содержать любое количество абстрактных методов, а также статические и дефолтные методы. Функциональный интерфейс — это особый тип интерфейса, который имеет ровно один абстрактный метод. Это свойство называется SAM (Single Abstract Method).
Функциональные интерфейсы являются основой для лямбда-выражений и ссылок на методы, введённых в Java 8. Лямбда-выражение может быть присвоено переменной типа функционального интерфейса или передано в метод, ожидающий такой интерфейс. Это позволяет писать более компактный и читаемый код, особенно при работе с коллекциями и потоками.
Пример обычного интерфейса:
interface MyInterface {
void method1();
void method2();
}Пример функционального интерфейса:
@FunctionalInterface
interface MyFunctionalInterface {
void doSomething();
// default и static методы разрешены
default void print() {
System.out.println("Default method");
}
}Использование с лямбдой:
MyFunctionalInterface func = () -> System.out.println("Hello");
func.doSomething();Аннотация @FunctionalInterface не обязательна, но рекомендуется. Она заставляет компилятор проверить, что интерфейс содержит ровно один абстрактный метод. Если добавить второй абстрактный метод, компилятор выдаст ошибку.
Функциональные интерфейсы упрощают написание кода с использованием лямбда-выражений и потоков. Их стоит применять, когда нужно передать поведение как параметр метода или реализовать простой callback. Обычные интерфейсы используются для более сложных контрактов с несколькими методами.