let, also и run с получателями, допускающими null
Используйте функции областей видимости, чтобы выполнять код только при ненулевом значении.
«let, also и run с получателями, допускающими null» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Функции области видимости и значения, допускающие null
Функции области видимости let, also и run отлично сочетаются с безопасным вызовом ?., позволяя выполнять блок только тогда, когда получатель не равен null.
let с безопасным вызовом
obj?.let { ... } выполняет блок только в том случае, если obj не равен null; внутри it обозначает значение, не допускающее null.
fun main() {
val name: String? = "Kotlin"
name?.let {
println("Length: ${it.length}")
println("Upper: ${it.uppercase()}")
}
}let пропускает блок при null
Если получатель равен null, весь блок let пропускается.
fun main() {
val name: String? = null
val result = name?.let {
println("never printed")
it.length
}
println(result) // null
}let возвращает значение
let возвращает последнее выражение своего блока, поэтому его можно объединять в цепочку с оператором Элвиса для задания значений по умолчанию.
fun main() {
val raw: String? = " hello "
val cleaned = raw?.let { it.trim().uppercase() } ?: "(empty)"
println(cleaned) // HELLO
}also для побочных эффектов
also выполняет блок ради его побочных эффектов и возвращает исходный получатель — это особенно удобно для ведения журнала в цепочке.
fun main() {
val name: String? = "Alice"
val len = name?.also { println("Processing: $it") }?.length
println("len = $len")
}also сохраняет значение
В отличие от let, also возвращает получатель без изменений. Используйте его, когда нужно просмотреть значение, не преобразуя его.
fun main() {
val items: List<Int>? = listOf(1, 2, 3)
items?.also { println("Got list of size ${it.size}") }
?.forEach { println(it) }
}run с безопасным вызовом
obj?.run { ... } выполняет блок, связывая this с получателем. Используйте его, когда нужен доступ к членам без префикса it..
fun main() {
val name: String? = "Kotlin"
val info = name?.run {
"len=$length upper=${uppercase()}"
}
println(info)
}let и run
let использует it (аргумент лямбды), а run — this (получатель). Выбирайте вариант, который лучше читается.
class User(val name: String, val age: Int)
fun main() {
val user: User? = User("Ada", 35)
user?.let { "${it.name} age ${it.age}" }.also(::println)
user?.run { "$name age $age" }.also(::println)
}Объединение нескольких областей видимости
Объединяйте функции области видимости в цепочку внутри конвейера для пошагового преобразования и ведения журнала.
fun main() {
val raw: String? = " hello "
val result = raw
?.also { println("raw: '$it'") }
?.let { it.trim() }
?.also { println("trimmed: '$it'") }
?.uppercase()
println(result) // HELLO
}let с takeIf
Объединяйте takeIf (фильтрацию) с let для выполнения на основе предиката.
fun main() {
val name: String? = "Kotlin"
name?.takeIf { it.length > 3 }
?.let { println("Long name: $it") }
}Антишаблон: вложенные условия if
До появления функций области видимости:
fun main() {
val name: String? = "Alice"
// OLD WAY:
if (name != null) {
val upper = name.uppercase()
println(upper)
}
// NEW WAY:
name?.let { println(it.uppercase()) }
}Быстрая проверка
Какая функция области видимости возвращает получатель без изменений и в основном используется ради побочных эффектов?
Итоги
Объединяйте ?. с let (блок возвращает значение и использует it), run (блок возвращает значение и использует this) или also (возвращает получатель и используется ради побочных эффектов). Все они пропускают выполнение, если получатель равен null.
Часто задаваемые вопросы
Урок «let, also и run с получателями, допускающими null» бесплатный?
Да — полный текст урока «let, also и run с получателями, допускающими null» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «let, also и run с получателями, допускающими null»?
Используйте функции областей видимости, чтобы выполнять код только при ненулевом значении. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «let, also и run с получателями, допускающими null»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Типы, допускающие null, и модификатор ?
- Безопасный вызов ?. и Elvis ?: в реальном коде
- let, also и run с получателями, допускающими null
- Оператор !!: когда и почему его следует избегать