Контекстные функции (Scope Functions)

Небольшая шпаргалка по функциям: 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)Аргумент лямбдыВозвращает
letitРезультат
runthisРезультат
withthisРезультат
applythisсам
alsoitсам

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
Аргумент лямбды itlet()also()
Приемник thisrun()apply()

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *