Задать вопрос
@KhihotDon

В какой момент лямбда в java считывает локальную переменную?

Смотрел лекции Тагира Валеева на канале CSC, в одной из лекций, он объяснял, что не всегда метод референс можно переделать в лямбду. В качестве примера он приводил, что когда мы присваиваем в объект функционального интерфейса метод референс System.out::println мы считываем значение статического поля out во время создания, в случае же лямбды мы считываем то значения поля, которое будет во время "запуска" лямбды.
В случае локальной переменной, когда мы считываем ее значения?
Если во время запуска лямбды, то если мы запускаем ее в другом потоке, то мы просто не сможем ее прочитать, т.к. поток в котором она создавалась может освободить ресурсы.
Если же во время создания лямбды, то зачем тогда нам "захватывать" ее
Вопрос собственно в этом, в какой момент лямбда считывает значение локальной переменной
  • Вопрос задан
  • 143 просмотра
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Компилятор преобразовывает лямбды в анонимные классы. Эти классы могут менять поля объемлющего объекта или других объектов, на которые имеют ссылки. Но передаваемые в лямбды локальные переменные должны быть неизменяемыми, так как замыкания в Java эмулируются созданием в анонимном классе поля, захватывающего значение замыкаемой переменной. Убедиться в этом просто. Скомпилируем класс

public class Main {
    public static void main(String[] args) throws Exception {
        String value = "Test";
        Supplier<String> lambda = () -> value;
    }
}

и запустим с параметром -Djdk.internal.lambda.dumpProxyClasses=., чтобы Java сохранила сгенерированный анонимный класс. Заглянем внутрь этого класса

$ javap -p Main$$Lambda$1
final class Main$$Lambda$1 implements java.util.function.Supplier {
  private final java.lang.String arg$1;  // Захваченная переменная value
  private Main$$Lambda$1(java.lang.String);
  private static java.util.function.Supplier get$Lambda(java.lang.String);
  public java.lang.Object get();
}


Об этом можно почитать у Брайана Гетца в "State of the Lambda: Variable capture".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 дек. 2024, в 06:04
15000 руб./за проект
21 дек. 2024, в 01:12
1000 руб./за проект
20 дек. 2024, в 22:55
1500 руб./за проект