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. Вопросы на собесе
- Что такое scope-функции в Kotlin и какие функции входят в их группу?
- Каковы основные различия между let, run, with, apply, и also?