Получить доступ

Почему лямбда может захватывать только effectively final локальные переменные?

MiddleЛямбды и Stream API
Коротко

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

  • Поля объекта и статические поля менять можно — ограничение только на локальные
  • Нужен изменяемый счётчик — AtomicInteger или массив из одного элемента (хак)
  • Effectively final — переменная не переприсваивается после инициализации, даже без слова final

А ещё Изменять общее состояние из лямбды в parallel stream — гонка

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Локальные переменные живут на стеке и исчезают с кадром метода, поэтому лямбда захватывает их значение, а не саму ячейку. Разрешить мутацию значило бы менять копию незаметно для оригинала. Поля объекта и статические поля менять можно — ограничение только на локалки. Нужен изменяемый счётчик — берут поле, массив-холдер или Atomic.

Что хотят услышать

  • Захват значения и время жизни кадра.
  • Различие локальных переменных и полей.

Частые ошибки

  • Пытаться инкрементировать локальную переменную из лямбды.
  • Считать, что ограничение касается и полей объекта.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Локалки живут на стеке и исчезают с кадром метода, поэтому захватывается их значение (копия); мутацию запрещают во избежание рассинхрона. Изменяемое состояние держат в поле/holder/Atomic
  • ✗Это ограничение синтаксиса, обходится словом var
  • ✗Лямбда вообще не может читать локальные переменные
  • ✗Потому что лямбды всегда выполняются в другом потоке

Что спросят дальше

  • Как обойти запрет через holder/Atomic?
  • Что значит effectively final?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем