Gymterview
junior

К каким переменным есть доступ у лямбда-выражений?

Лямбда-выражение может обращаться к переменным из внешней области видимости, но с ограничениями. Доступны три категории переменных: effectively final локальные переменные, поля экземпляра класса и статические переменные.

Правила доступа

Категория переменной Доступ из лямбды Можно ли изменять?
Локальная effectively final Да (чтение) Нет
Поле экземпляра Да (чтение и запись) Да
Статическая переменная Да (чтение и запись) Да
default-метод функционального интерфейса Нет –

Effectively final означает, что переменная не обязана быть помечена final, но после инициализации её значение не должно изменяться. Это ограничение существует потому, что лямбда захватывает копию значения локальной переменной, а не ссылку на неё. Если бы переменная менялась, копия стала бы некорректной — поэтому компилятор запрещает модификацию.

Поля класса и статические переменные хранятся в куче (heap), а не на стеке, поэтому лямбда может безопасно читать и изменять их значения.

На собеседовании: часто просят объяснить, почему нельзя модифицировать локальную переменную внутри лямбды. Ключевой аргумент — лямбда захватывает копию значения, а не ссылку на переменную стека, поэтому изменение оригинала привело бы к рассинхронизации.