Небольшая шпаргалка по функциям: 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() |