Java Development
Александр Вотин, Backend developer · 28.09
Лямбда-выражения. Как они работают "под капотом"
Лямбда — это, по сути, анонимная функция. Она может передаваться как параметр в метод, сохраняться в переменной или возвращаться из функции. Но что же происходит, когда компилятор встречает твою лямбду?
Когда ты пишешь лямбда-выражение, JVM не создаёт для него какой-то магической структуры. Вместо этого, она использует уже знакомый нам механизм функциональных интерфейсов. Это интерфейсы с единственным абстрактным методом, которые могут быть реализованы через лямбду.
Когда компилятор видит лямбду, он не создаёт новый класс, а использует механизм, называемый invokedynamic. Вместо традиционного создания анонимных классов (как было до Java 8), JVM генерирует специальный байт-код, который динамически вызывает метод функционального интерфейса.
- Лямбда привязывается к функциональному интерфейсу.
- В Java 8 появился новый тип вызова метода — invokedynamic. Этот механизм позволяет JVM во время исполнения программы найти и подставить нужный метод. Благодаря этому лямбда-выражения работают быстрее и занимают меньше памяти, чем старые анонимные классы.
- Лямбда связывается с методом интерфейса через динамическое разрешение. Это значит, что JVM не создаёт новый объект для каждой лямбды, а генерирует байт-код для вызова метода при необходимости.
Пример реализации через функциональный интерфейс на изображении.
В отличие от анонимных классов, лямбда-выражения не создают лишние объекты, что снижает нагрузку на память. Механизм invokedynamic позволяет JVM динамически оптимизировать вызовы методов, что делает выполнение лямбд более быстрым.
еще контент автора
еще контент автора
Java Development
Александр Вотин, Backend developer · 28.09
войдите, чтобы увидеть
и подписаться на интересных профи