Можно ли реализовать лямбда-выражение в Java с помощью обычного класса?

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

Ответ

Да, можно. Лямбда-выражение — это синтаксический сахар для создания экземпляра анонимного класса, реализующего функциональный интерфейс (интерфейс с одним абстрактным методом).

Пример эквивалентности:

// 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.
  • Использование лямбд предпочтительнее для читаемости и краткости кода.