На базе механизма Invoke Dynamic (JSR 292). Он позволяет отложить разрешение вызовов методов до момента выполнения. Это делает лямбды более гибкими и производительными, чем использование анонимных внутренних классов для простых функциональных интерфейсов.
Java компилятор преобразует лямбда-выражение в специфичную конструкцию с использованием статического метода lambda$(), который вызывается через invokedynamic.
Пример:
java
После компиляции, код с лямбдой будет выглядеть примерно так (в байткоде):
bytecode
Bootstrap Method (метод начальной загрузки) для invokedynamic решает, какой метод вызвать. В случае лямбд это обычно java.lang.invoke.LambdaMetafactory.metafactory(), который генерирует класс и экземпляр функционального интерфейса во время выполнения, связывая его с реализацией лямбды (в данном случае, статическим методом lambda$0).
Этот подход снижает накладные расходы на создание многочисленных анонимных внутренних классов для простых лямбд, улучшая производительность и использование памяти, особенно в коллекциях и стримах.