digital-garden/knowledge/dev/java/Лямбды в Java.md
2024-06-13 21:01:37 +03:00

17 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 сохраняет метод, который реализует лямбда-выражение, а не само лямбда-выражение.