0Pricing
Kotlin Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Типы, допускающие null, и модификатор ?
  2. Безопасный вызов ?. и Elvis ?: в реальном коде
  3. let, also и run с получателями, допускающими null
  4. Оператор !!: когда и почему его следует избегать
← Назад к Kotlin Academy