Вопрос проверяет понимание различий между лямбда-выражениями и анонимными классами в Java, что важно для написания современного, лаконичного и эффективного кода.
В Java оба механизма позволяют инкапсулировать поведение "на лету", но они работают по-разному и имеют разные области применения.
(параметры) -> выражение. Анонимные классы используют более многословный синтаксис с ключевым словом new и телом класса.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 интерфейсов или наследование от классов.