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

«Что такое функциональный интерфейс в Java?» — вопрос из категории Java Core, который задают на 38% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Функциональный интерфейс — это интерфейс, который содержит ровно один абстрактный метод (SAM — Single Abstract Method). Он может содержать любое количество default или static методов. Аннотация @FunctionalInterface является необязательной, но явно указывает на назначение интерфейса и позволяет компилятору проверить это условие.

Пример объявления и использования:

@FunctionalInterface
interface MathOperation {
    int execute(int a, int b); // Единственный абстрактный метод

    default void printResult(int result) { // default-метод допустим
        System.out.println("Result: " + result);
    }
}

// Реализация с помощью лямбда-выражения:
MathOperation addition = (x, y) -> x + y;
int sum = addition.execute(5, 3); // 8

// Реализация с помощью ссылки на метод:
MathOperation multiply = Math::multiplyExact; // Если есть подходящий статический метод

Зачем это нужно? Функциональные интерфейсы — это основа для лямбда-выражений и ссылок на методы в Java. Они широко используются в Stream API и других API, требующих передачи поведения.

Стандартные функциональные интерфейсы из java.util.function:

  • Function<T, R> — принимает T, возвращает R.
  • Predicate<T> — принимает T, возвращает boolean.
  • Consumer<T> — принимает T, не возвращает ничего (void).
  • Supplier<T> — не принимает аргументов, возвращает T.