← Назад к вопросам

Какие знаешь примеры использования функции let?

1.3 Junior🔥 161 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Примеры использования функции let в Kotlin

Функция let в Kotlin — это стандартная функция-расширение (extension function) для всех типов, которая позволяет выполнить блок кода над объектом и вернуть результат этого блока. Она особенно полезна для работы с nullable типами, преобразования данных и ограничения scope переменных. Основная форма: object.let { lambda }, где lambda получает объект как аргумент и возвращает результат.

Ключевые сценарии использования let

1. Безопасная работа с nullable типами (Null Safety)

Это самый распространённый пример. let исполняется только если объект не null, благодаря безопасному вызову (?.).

val nullableString: String? = "Hello"
nullableString?.let {
    // Блок выполнится только если nullableString не null
    println(it.length) // 'it' ссылается на nullableString
    it.toUpperCase()
} // Результат: "HELLO"

val nullString: String? = null
nullString?.let {
    println("This won't be executed")
} // Ничего не произойдет, результат null

2. Преобразование объекта (Transformation)

let часто используется для преобразования одного объекта в другой, особенно в цепочках вызовов.

val userInput = "123"
val parsedNumber = userInput.let {
    it.toIntOrNull() // Преобразуем String в Int?
} // Результат: Int? = 123

3. Ограничение области видимости переменной (Scoping)

Когда нужно временно использовать объект с новым именем или ограничить его область видимости.

val someList = listOf(1, 2, 3)
val result = someList.let { list ->
    // Внутри блока доступна переменная 'list'
    list.map { it * 2 }.sum()
} // Результат: 12
// Вне блока 'list' не доступна

4. Выполнение побочных эффектов с гарантией существования объекта

Полезно для выполнения действий, которые требуют не-null объекта, например, логирования.

data class User(val name: String)
val potentialUser: User? = User("Alice")

potentialUser?.let { user ->
    println("Processing user: ${user.name}")
    // Дополнительные операции...
}

5. Чтение свойств объекта после проверки условия

Комбинация let с другими условиями внутри блока.

val someObject: Any? = "Kotlin"
(someObject as? String)?.let { str ->
    if (str.length > 3) {
        str.reversed()
    } else {
        str
    }
} // Результат: "niltok"

6. Использование в цепочках вызовов (Chaining)

let может быть частью более сложной цепочки операций.

val configuration: Map<String, Any?>? = mapOf("port" to 8080, "host" to "localhost")
val port = configuration?.get("port")?.let { it as? Int }?.let { 
    if (it in 1..65535) it else null 
}

Практический пример из Android разработки

В Android let часто используется при работе с nullable View, LiveData или результатами из Room.

// Пример с View
view?.let { nonNullView ->
    nonNullView.alpha = 0.5f
    nonNullView.setOnClickListener { /* ... */ }
}

// Пример с LiveData
userLiveData.value?.let { user ->
    updateUi(user.name, user.email)
}

// Пример при обработке результата из Room
fun onUserLoaded(user: User?) {
    user?.let {
        with(it) { // Использование 'with' вместе с 'let'
            saveToCache(id, name)
            notifyObservers()
        }
    }
}

Отличие let от других scope функций (run, with, apply, also)

  • let возвращает результат лямбды, принимает объект как аргумент (it).
  • apply возвращает сам объект (this), используется для конфигурации.
  • also возвращает сам объект (it), используется для побочных действий.
  • run может работать как с объектом (this), так и без него.
  • with не является extension function, принимает объект как аргумент.

let особенно ценен в null-safe контекстах благодаря оператору ?., что делает код более чистым и безопасным по сравнению с явными проверками if (obj != null). Он способствует написанию более декларативного и последовательного кода, уменьшая количество временных переменных и промежуточных шагов.