Scope Functions

https://kotlinlang.org/docs/reference/scope-functions.html

Scope functions

Функции контекста. Функции области видимости. Позволяют выполнить для некоторого объекта некоторый код в виде лямбда-выражение. При вызове подобной функции, создается временная область видимости. В этой области видимости можно обращаться к объекту без использования его имени. Scoped functions are functions that execute a block of code within the context of an object. There are five scoped functions in kotlin: let, run, with, also and apply. Scope function различаются результатом, который они возвращают

let

Лямбда-выражение в функции let в качестве параметра it получает объект, для которого вызывается функция. Возвращаемый результат функции let представляет результат данного лямбда-выражения

email?.let {
    println("Email: $it")
}
email?.let(::println)

run

Лямбда-выражение в функции run в качестве параметра this получает объект, для которого вызывается функция. Возвращаемый результат функции run представляет результат данного лямбда-выражения

val tom = Person("Tom", null)
val validationResult = tom.email?.run {"valid"} ?: "undefined"

with

Позволяет выполнить несколько операций над одним объектом, не повторяя его имени. Функция принимает два аргумента - объект и лямбда-выражение. Первый аргумент преобразуется в получатель лямбда-выражения. К получателю можно обращаться через this

with(email) {
    substring(1)
    this.take(1)
}

apply

Лямбда-выражение в функции apply в качестве параметра this получает объект, для которого вызывается функция. Возвращаемым результатом функции фактически является передаваемый в функцию объект для которого выполняется функция

val person = Person("Tom")
person.apply {
    tom.name = "Sam"
}

also

Лямбда-выражение в функции also в качестве параметра it получает объект, для которого вызывается функция. Возвращаемым результатом функции фактически является передаваемый в функцию объект для которого выполняется функция. Эта функция аналогична функции apply за тем исключением, что внутри also объект, над которым выполняется блок кода, доступен через параметр it

val person = Person("Tom")
person.also {
    it.name = "Sam"
}

takeIf

Возвращает объект-приемник если оно удовлетворяет заданному предикату или null если нет.

val text: String? = File("myfile.txt").takeIf { it.canRead() && it.canWrite() }?.readText() // with takeIf
    
val file = File("myfile.txt")
val text: String? = if (file.canRead() && file.canWrite()) file.readText() else null // without takeIf

Kotlin Scope Functions. Вопросы на собесе
  1. Что такое scope-функции в Kotlin и какие функции входят в их группу?
  1. Каковы основные различия между let, run, with, apply, и also?