Назад к вопросам
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-типом, что позволяет сопоставлять его с лямбда-выражениями и ссылками на методы.