Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: lambda, anonymous class, Java, functional interface, SAM

Чем лямбда отличается от анонимного класса?

Вопрос проверяет понимание различий между лямбда-выражениями и анонимными классами в Java, что важно для написания современного, лаконичного и эффективного кода.

Короткий ответ

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

Длинный ответ

В Java оба механизма позволяют инкапсулировать поведение "на лету", но они работают по-разному и имеют разные области применения.

Ключевые различия

  • Синтаксис: Лямбда-выражения (появились в Java 8) имеют лаконичный синтаксис: (параметры) -> выражение. Анонимные классы используют более многословный синтаксис с ключевым словом new и телом класса.
  • Целевой тип: Лямбда может быть использована только для реализации функционального интерфейса (интерфейса с одним абстрактным методом — SAM). Анонимный класс может реализовать интерфейс с любым количеством методов или даже расширить конкретный класс.
  • Область видимости this: Внутри лямбды this ссылается на окружающий класс. Внутри анонимного класса this ссылается на сам анонимный класс.
  • Компиляция: Лямбда-выражения компилируются с использованием инструкций invokedynamic, что может быть более эффективно. Анонимные классы создают отдельный файл .class во время компиляции.

Примеры кода

Рассмотрим интерфейс Runnable:

// Анонимный класс
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello from anonymous class");
    }
};

// Лямбда-выражение
Runnable r2 = () -> System.out.println("Hello from lambda");

// Запуск
r1.run();
r2.run();

Лямбда-выражение значительно короче. Однако, если интерфейс не является функциональным, лямбду использовать нельзя. Например, для интерфейса с двумя методами придётся использовать анонимный класс.

Где применяется

Лямбда-выражения стали стандартом для работы с Stream API, коллекциями и любыми API, построенными на функциональных интерфейсах (например, Comparator, Predicate). Они делают код декларативным и легко читаемым. Анонимные классы всё ещё необходимы, когда нужно:

  • Реализовать интерфейс с несколькими методами.
  • Расширить конкретный класс (не только интерфейс).
  • Создать экземпляр класса с переопределением нескольких методов.

Вывод: Используйте лямбда-выражения для простых реализаций функциональных интерфейсов — это делает код современным и лаконичным. Анонимные классы применяйте в более сложных сценариях, где требуется реализация не-SAM интерфейсов или наследование от классов.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Java

    Java

Ключевые слова

#lambda

#anonymous class

#Java

#functional interface

#SAM

Подпишись на Java Developer в телеграм