Выбор ответа Junior Лямбды, inline и reified обновлено
Захват изменяемой переменной в лямбде
Вопрос
Что выведет код?
var sum = 0
listOf(1, 2, 3).forEach { sum += it }
println(sum)
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: 6. В отличие от Java, лямбда в Kotlin может захватывать и менять var.
Варианты ответа
6правильный ответ0- Ошибка компиляции: переменная должна быть final
3
Разбор
В отличие от Java, лямбда в Kotlin может захватывать и менять var. Компилятор при необходимости оборачивает переменную в объект-ссылку (Ref.IntRef), а здесь forEach инлайнится, и код просто работает с локальной переменной. Сумма 1 + 2 + 3 = 6. Требование effectively final есть только в Java.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.