Какие переменные можно захватывать в лямбде?

Ответ

Только final или effectively final (не меняются после присваивания). Поля класса можно использовать без ограничений. Локальные переменные — только если они эффективно финальные, потому что захват идёт по значению (копия).

Разбор: Лямбда захватывает локальные переменные только если они final или effectively final, потому что захват идёт по значению (копия), а стек метода может быть уже разрушен. Поля экземпляра и статические поля доступны без ограничений через ссылку на объект/класс. Ловушка в том, что менять захваченную локальную переменную нельзя, и слово final писать не обязательно.

Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.

Заказать гайд Пройти тест
новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться