Ответ вслух Middle Лямбды, inline и reified обновлено

Лямбды и замыкания

Вопрос

Расскажи, как в Kotlin работают лямбды и замыкания и чем это отличается от Java.

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

В Kotlin функции это значения первого класса: есть функциональные типы вроде (Int) - String, их можно хранить в переменных, передавать и возвращать.

Что должно прозвучать в ответе

  • Функциональные типы `(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 ошибок.