Ответ
Да, можно. Лямбда-выражение — это синтаксический сахар для создания экземпляра анонимного класса, реализующего функциональный интерфейс (интерфейс с одним абстрактным методом).
Пример эквивалентности:
// 1. Определяем функциональный интерфейс
@FunctionalInterface
interface StringProcessor {
String process(String input);
}
public class Main {
public static void main(String[] args) {
// 2. Реализация через ОБЫЧНЫЙ (именованный) класс
class UpperCaseProcessor implements StringProcessor {
@Override
public String process(String input) {
return input.toUpperCase();
}
}
StringProcessor classImpl = new UpperCaseProcessor();
// 3. Реализация через ЛЯМБДА-ВЫРАЖЕНИЕ (анонимный класс под капотом)
StringProcessor lambdaImpl = (str) -> str.toUpperCase();
System.out.println(classImpl.process("hello")); // Вывод: HELLO
System.out.println(lambdaImpl.process("hello")); // Вывод: HELLO
}
}
Ключевые моменты:
- Компилятор преобразует лямбду в байт-код, аналогичный анонимному классу.
- Лямбда обеспечивает лаконичный синтаксис, но концептуально не вводит новой функциональности на уровне JVM.
- Использование лямбд предпочтительнее для читаемости и краткости кода.