Назад к вопросам
Middle
81
questionbank

Что ты знаешь о функциональных интерфейсах в Java 8 и более поздних версиях?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Функциональный интерфейс — это интерфейс, содержащий только один абстрактный метод. Он может иметь любое количество default или static методов.

Применение:

  • Позволяют использовать лямбда-выражения и ссылки на методы.
  • Являются основой Stream API.
  • Описывают контракты для функционального программирования в Java.

Примеры встроенных функциональных интерфейсов (пакет java.util.function):

  • Consumer<T>: Принимает аргумент, ничего не возвращает (void accept(T t)).
  • Supplier<T>: Ничего не принимает, возвращает значение (T get()).
  • Predicate<T>: Принимает аргумент, возвращает булево значение (boolean test(T t)).
  • Function<T, R>: Принимает аргумент типа T, возвращает значение типа R (R apply(T t)).
  • UnaryOperator<T>: Наследник Function<T, T>, принимает и возвращает значение одного типа (T apply(T t)).
  • BinaryOperator<T>: Наследник BiFunction<T, T, T>, принимает два значения одного типа и возвращает значение того же типа (T apply(T t1, T t2)).

Аннотация @FunctionalInterface:

  • Опциональна, но рекомендуется использовать.
  • Позволяет компилятору проверить, является ли интерфейс действительно функциональным (имеет только один абстрактный метод).

Пример пользовательского функционального интерфейса:

// Пользовательский функциональный интерфейс
@FunctionalInterface
interface MyOperation {
    // Единственный абстрактный метод
    int perform(int a, int b);

    // Default метод (не влияет на функциональность)
    default int applyAndAddOne(int a, int b) {
        return perform(a, b) + 1;
    }

    // Static метод (не влияет на функциональность)
    static void printResult(int result) {
        System.out.println("Result: " + result);
    }
}

Пример использования с лямбда-выражением:

// Использование функционального интерфейса с лямбда-выражением
MyOperation adder = (x, y) -> x + y;
int sum = adder.perform(5, 3); // sum == 8

MyOperation multiplier = (x, y) -> x * y;
int product = multiplier.perform(5, 3); // product == 15

Ключевая концепция —SAM (Single Abstract Method) Type. Функциональный интерфейс по сути является SAM-типом, что позволяет сопоставлять его с лямбда-выражениями и ссылками на методы.