17 lines
3.4 KiB
Markdown
17 lines
3.4 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date: 2023-11-15
|
|||
|
zero-link:
|
|||
|
- "[[00 Java разработка]]"
|
|||
|
parents:
|
|||
|
linked:
|
|||
|
---
|
|||
|
Лямбда-выражения в Java представляют собой интересную и относительно сложную часть языка, особенно когда речь идет о том, как они работают во время выполнения программы. Вот основные моменты, которые стоит понимать:
|
|||
|
|
|||
|
1. **Преобразование в Функциональные Интерфейсы**: В исходном коде лямбда-выражение представляет собой синтаксическую конструкцию, которая может быть преобразована в экземпляр функционального интерфейса. Функциональный интерфейс — это интерфейс с одним абстрактным методом (такие интерфейсы иногда называют SAM-интерфейсами, от Single Abstract Method).
|
|||
|
2. **Использование инструкции `invokedynamic`**: В Java 7 была добавлена новая байт-код инструкция под названием `invokedynamic`, которая позволила упростить реализацию динамических языков на JVM. В Java 8 эта инструкция начала использоваться для реализации лямбда-выражений. `invokedynamic` позволяет отложить привязку метода, который должен быть вызван, до времени выполнения программы.
|
|||
|
3. **Механизмы `LambdaMetafactory`**: Когда JVM впервые встречает лямбда-выражение, она использует механизм, называемый `LambdaMetafactory`, для создания экземпляра функционального интерфейса. `LambdaMetafactory` использует сгенерированный на лету код, который реализует функциональный интерфейс с использованием тела лямбда-выражения.
|
|||
|
4. **Кеширование и Производительность**: Один из ключевых аспектов реализации лямбда-выражений в Java — это то, что они кешируются и повторно используются. Когда лямбда-выражение встречается несколько раз, JVM не создает каждый раз новый экземпляр. Это повышает производительность, особенно в ситуациях, где одно и то же лямбда-выражение используется многократно.
|
|||
|
5. **Сериализация**: Лямбда-выражения могут быть сериализованы, если функциональный интерфейс, который они реализуют, объявлен как `Serializable`. Во время сериализации JVM сохраняет метод, который реализует лямбда-выражение, а не само лямбда-выражение.
|