Как работает лямбда выражение в Kotlin и что оно возвращает
AndroidKotlinлямбда-выраженияосновы языкапрограммирование
Что проверяют
Понимаете ли вы, что лямбда это выражение функционального типа со значением последнего выражения тела, и знаете ли, как ведёт себя return внутри неё.
Как отвечать
- Лямбда пишется в фигурных скобках: параметры до стрелки, тело после, единственный параметр доступен как
it. Тип выводится из контекста либо задаётся явно. - Возвращается значение последнего выражения, отдельный
returnдля этого не нужен и запрещён: обычныйreturnвнутри лямбды означает выход из внешней функции и допустим только в inline-функциях (нелокальный возврат). Локальный выход делается меткой:return@map. - Лямбда это объект функционального типа: без
inlineсоздаётся реализацияFunctionN, замыкание держит захваченные переменные. Kotlin, в отличие от Java, разрешает захватывать и менятьvar, компилятор заворачивает её в объект-ссылку. inlineу функции высшего порядка встраивает тело лямбды в место вызова, убирая аллокацию и открывая нелокальныйreturn. Исключения из правила задаютnoinlineиcrossinline.- Отдельно назовите лямбду с получателем
T.() -> Unit: на ней построеныapply,withи DSL-билдеры. Для Java-интерфейсов работает SAM-конверсия, для своих типов естьfun interface.
val sum: (Int, Int) -> Int = { a, b -> a + b }
fun firstNegative(xs: List<Int>): Int? {
xs.forEach { if (it < 0) return it } // выход из firstNegative: forEach inline
return null
}
val squares = listOf(1, 2, 3).map { it * it } // значение последнего выраженияГде спотыкаются
Пишут return внутри лямбды, ожидая возврата из неё, и получают либо ошибку компиляции, либо неожиданный выход из внешней функции.
Путают лямбду и анонимную функцию fun(x: Int): Int { ... }. У второй return локальный, а тип из контекста так свободно не выводится.
Не знают про inline и уверяют, что лямбды бесплатны. Без встраивания это объект, а при захвате переменных ещё и дополнительные ссылки.
На Android держат лямбду-колбэк дольше владельца: захваченные Activity или View не соберутся сборщиком мусора, пока жива подписка.