Небольшая шпаргалка по функциям: let
, apply
, run
, also
и with
для kotlin.
Основная цель этих функции: выполнение ряда действий в контексте какого-либо объекта, Например
Person("Alice", 20, "Amsterdam").let {
println(it)
it.moveTo("London")
it.incrementAge()
println(it)
}
Что аналогично
val alice = Person("Alice", 20, "Amsterdam")
println(alice)
alice.moveTo("London")
alice.incrementAge()
println(alice)
Т.е. let создал контекстную область, где подменил основной объект контекста короткой ссылкой it.
В следующем примере c apply вместо it используется this:
val adam = Person("Adam").apply {
age = 20 // same as this.age = 20 or adam.age = 20
city = "London"
}
println(adam)
В примере с also, в добавок можно использовать сам объект как результат лямбды
val numberList = mutableListOf<Double>()
numberList.also { println("Populating the list") }
.apply {
add(2.71)
add(3.14)
add(1.0)
}
.also { println("Sorting the list") }
.sort()
Другими словами функции отличаются по двум критериям:
- Как обращаться к объекту контекста: по it или через this
- Что возвращает функция
Что с чем видно по сводной таблице.
Функция | Приемник (receiver) | Аргумент лямбды | Возвращает |
let | — | it | Результат |
run | this | — | Результат |
with | — | this | Результат |
apply | this | — | сам |
also | — | it | сам |
with
Эта функция как и run работает в контексте this и возвращает результат лямбды, но в отличии от run, this передается как аргумент, а не приемник лямбды (receiver). У авторов котлина для with есть специальные варианты использования, для повышения читаемости.
Подчеркивание общности операций
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
Вычисление результата
val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
"The first element is ${first()}," +
" the last element is ${last()}"
}
println(firstAndLast)
Запоминалки
Для упрощения запоминания что c чем, здесь буду собирать различные запоминалки
LARA
Результат лямбды | Приемник this | |
Аргумент лямбды it | let() | also() |
Приемник this | run() | apply() |