Лямбды и замыкания
Вопрос
Расскажи, как в Kotlin работают лямбды и замыкания и чем это отличается от Java.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Функциональные типы `(A) -> B` первого класса
Лямбда может захватывать и менять var, в Java только effectively final
Захваченная var оборачивается в Ref-объект
Лямбда с получателем `T.() -> R` основа DSL
Захват контекста Activity в долгоживущей лямбде даёт утечку
Что могут спросить следом
- Как сделать лямбду, которая выполнится только один раз?
- Что такое ссылка на функцию
::foo?
Разбор
В Kotlin функции это значения первого класса: есть функциональные типы вроде (Int) -> String, их можно хранить в переменных, передавать и возвращать. Лямбда может захватывать переменные из окружения, и в отличие от Java не только effectively final: можно менять var, компилятор обернёт её в объект-ссылку Ref, чтобы лямбда и внешний код видели одно значение. Есть ссылки на функции, ::println или String::length. Особый вид это лямбда с получателем T.() -> R: внутри неё this указывает на объект, на этом построены apply, buildString и любой DSL. Практический риск на Android: лямбда держит ссылку на всё, что захватила. Если колбэк с захваченной Activity лежит в синглтоне или долгоживущем объекте, Activity не соберётся сборщиком мусора.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.