Выбор ответа Junior Лямбды и Stream API спрашивают часто обновлено
Переменная в лямбде
Вопрос
Почему не скомпилируется код?
int count = 0;
list.forEach(s -> {
if (s.isEmpty()) count++;
});
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Лямбда захватывает только effectively final переменные, а count меняется. Лямбда захватывает копию значения локальной переменной, поэтому переменная должна быть final или effectively final.
Варианты ответа
- Лямбды вообще не могут обращаться к локальным переменным метода
- Лямбда захватывает только effectively final переменные, а
countменяетсяправильный ответ forEachне принимает лямбды с телом в фигурных скобках, только выражения- Переменную
countнужно объявить какvolatile, раз её меняет лямбда
Разбор
Лямбда захватывает копию значения локальной переменной, поэтому переменная должна быть final или effectively final. Здесь count++ меняет её. Читать неизменяемые локальные переменные лямбда может. Блочные лямбды разрешены. volatile к локальным переменным неприменим. Правильно: long count = list.stream().filter(...).count().
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.