Вопрос проверяет понимание связи между лямбда-выражениями и функциональными интерфейсами в Java, что необходимо для работы с функциональным программированием.
Лямбда-выражения в Java тесно связаны с функциональными интерфейсами. Функциональный интерфейс — это интерфейс, который содержит ровно один абстрактный метод (например, Runnable, Comparator, Predicate). Лямбда-выражение предоставляет реализацию этого единственного метода, заменяя громоздкие анонимные классы.
Когда вы пишете лямбду, компилятор Java определяет, какой функциональный интерфейс она реализует, по контексту (например, тип переменной или параметра метода). Лямбда не создает отдельный класс, а генерирует байт-код, который вызывает метод интерфейса.
// Функциональный интерфейс
@FunctionalInterface
interface Calculator {
int operate(int a, int b);
}
public class Main {
public static void main(String[] args) {
// Лямбда реализует метод operate
Calculator add = (a, b) -> a + b;
System.out.println(add.operate(5, 3)); // 8
// Анонимный класс (эквивалент)
Calculator multiply = new Calculator() {
@Override
public int operate(int a, int b) {
return a * b;
}
};
System.out.println(multiply.operate(5, 3)); // 15
}
}Лямбды широко используются в Stream API, обработке событий, многопоточности и коллекциях. Они позволяют передавать поведение как данные, делая код более декларативным.
Вывод: Лямбды и функциональные интерфейсы неразрывно связаны: лямбда — это синтаксический сахар для реализации функционального интерфейса. Используйте их для упрощения кода, особенно при работе с коллекциями и потоками данных.