Выбор ответа Junior Лямбды и Stream API спрашивают часто обновлено

Переменная в лямбде

Вопрос

Почему не скомпилируется код?

int count = 0;
list.forEach(s -> {
    if (s.isEmpty()) count++;
});

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Лямбда захватывает только effectively final переменные, а count меняется. Лямбда захватывает копию значения локальной переменной, поэтому переменная должна быть final или effectively final.

Варианты ответа

  1. Лямбды вообще не могут обращаться к локальным переменным метода
  2. Лямбда захватывает только effectively final переменные, а count меняетсяправильный ответ
  3. forEach не принимает лямбды с телом в фигурных скобках, только выражения
  4. Переменную count нужно объявить как volatile, раз её меняет лямбда

Разбор

Лямбда захватывает копию значения локальной переменной, поэтому переменная должна быть final или effectively final. Здесь count++ меняет её. Читать неизменяемые локальные переменные лямбда может. Блочные лямбды разрешены. volatile к локальным переменным неприменим. Правильно: long count = list.stream().filter(...).count().

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.