TGViewer
Java | Вопросы собесов Java | Вопросы собесов @easy_java_ru · 11.3K subscribers
Post #938 3.12K
🤔 На базе чего работают Lambda выражения?

Лямбда-выражения в Java работают на основе нескольких ключевых концепций и механизмов, включая функциональные интерфейсы, инструкции invokedynamic, и использование java.lang.invoke.MethodHandle и java.lang.invoke.LambdaMetafactory.

🚩Основные компоненты

🟠Функциональные интерфейсы
Лямбда-выражения могут использоваться только в контексте функционального интерфейса. Функциональный интерфейс — это интерфейс, который имеет только один абстрактный метод. Примеры функциональных интерфейсов: Runnable, Callable, Comparator, и интерфейсы из пакета java.util.function (Function, Predicate, Consumer, Supplier).

🟠Инструкция `invokedynamic`
invokedynamic — это инструкция байт-кода, введенная в Java 7, которая позволяет динамически связывать вызовы методов во время выполнения. В случае лямбда-выражений, invokedynamic используется для создания инстанции функционального интерфейса.

🟠`java.lang.invoke.MethodHandle` и `java.lang.invoke.LambdaMetafactory`
MethodHandle — это легковесный, типобезопасный способ описания подлежащих вызову методов, конструкторов и полей. LambdaMetafactory — это утилита, используемая JVM для создания реализации функционального интерфейса на основе лямбда-выражения. При выполнении инструкции invokedynamic JVM вызывает LambdaMetafactory для создания экземпляра функционального интерфейса.

🚩Пример работы лямбда-выражения под капотом

1⃣Написание лямбда-выражения
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));


2⃣Компиляция лямбда-выражения
Компилятор преобразует лямбда-выражение в байт-код, который использует инструкцию invokedynamic. Инструкция invokedynamic указывает на метод-обработчик (MethodHandle) для метода System.out.println(name).

3⃣Выполнение лямбда-выражения
При выполнении инструкции invokedynamic JVM вызывает LambdaMetafactory для создания инстанции функционального интерфейса Consumer<String>. LambdaMetafactory создает реализацию интерфейса Consumer<String> с методом accept, который вызывает System.out.println(name).

🚩Преобразование лямбда-выражения

// Лямбда-выражение
Consumer<String> consumer = name -> System.out.println(name);

// Компилируется в байт-код, который использует invokedynamic
Consumer<String> consumer = (Consumer<String>) LambdaMetafactory.metafactory(
caller,
"accept",
MethodType.methodType(Consumer.class),
MethodType.methodType(void.class, Object.class),
MethodHandles.lookup().findVirtual(System.out.getClass(), "println", MethodType.methodType(void.class, String.class)),
MethodType.methodType(void.class, String.class)
).getTarget().invoke();


🚩Плюсы

➕Компактность
Лямбда-выражения позволяют писать более компактный и читаемый код.
➕Производительность
Использование invokedynamic и LambdaMetafactory позволяет JVM генерировать высокоэффективный байт-код для лямбда-выражений.
➕Гибкость
Лямбда-выражения могут использоваться в любых контекстах, где ожидается функциональный интерфейс.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 8
  • 🔥 2
  • ❤ 1
  • 👀 1
More from @easy_java_ru
  1. Oct 9, 2026🤔 Что такое «HTML»? HTML (HyperText Markup Language) — это язык разметки, используемый дл…
  2. Oct 9, 2026🤔 В чём различие между LeftJoin , RightJoin и InnerJoin? LEFT JOIN, RIGHT JOIN и INNER JO…
  3. Oct 8, 2026Post #2955
  4. Oct 8, 2026🤔 Что такое поток "демон"? Демон-поток — это поток, который: - Работает на фоне (например…
  5. Oct 7, 2026🤔 Может ли Entity-класс быть абстрактным? Да, Entity может быть абстрактным, если он служ…
  6. Oct 7, 2026🤔 К какой категории сущности относится Primary Key? Primary Key (первичный ключ) в базах…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →