Java Core middle
Лямбда-выражения: почему переменные должны быть effectively final?
Ответ
Лямбда захватывает копию значения переменной, не ссылку на неё. Если переменная изменится после захвата — копия устареет → неочевидное поведение. Компилятор требует final или effectively final для защиты от ошибок.
Разбор: Лямбда захватывает копию значения локальной переменной (capture by value), а не ссылку на неё, поэтому изменение оригинала после захвата сделало бы копию рассогласованной — компилятор требует final/effectively final для устранения этой неоднозначности. Дистракторы подменяют причину: дело не в потокобезопасности, не в «статическом методе» и не в запрете кучи, а именно в семантике копирования значения.
Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.