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

В чем разница между scope функциями apply и let?

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

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

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

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

Разница между scope-функциями apply и let в Kotlin

В Kotlin scope-функции (let, apply, also, run, with) предоставляют возможность выполнить блок кода в контексте объекта. apply и let — две наиболее часто используемые, но они имеют принципиальные различия в назначении и поведении.

Ключевые различия в таблице

Характеристикаapplylet
Контекст (this vs it)Использует this как получатель (доступен неявно)Использует it как параметр (доступен явно)
Возвращаемое значениеВозвращает сам объект (контекст)Возвращает результат лямбды (последняя строка)
Основное назначениеИнициализация или конфигурация объектаТрансформация или безопасная обработка nullable-объектов

1. Контекст выполнения и способ обращения к объекту

Функция apply

Внутри блока apply объект доступен как this (получатель). Это позволяет вызывать методы и устанавливать свойства без явного упоминания имени объекта.

val task = Task().apply {
    // this: Task (неявно)
    title = "Изучить Kotlin"
    priority = 5
    // Неявный доступ к свойствам через `this`
}

Функция let

Внутри блока let объект доступен как it (аргумент лямбды). Это требует явного указания it или переименования параметра.

val formattedTitle: String = task.title?.let { title ->
    // Явный доступ через параметр `it` или его алиас `title`
    "Задача: $title"
} ?: "Без названия"

2. Возвращаемое значение

apply возвращает исходный объект

Идеально для последовательной инициализации (Builder-паттерн).

val textView = TextView(context).apply {
    text = "Hello"
    textSize = 16f
    setPadding(10, 10, 10, 10)
    // Возвращается этот же TextView
}
// textView — это созданный и сконфигурированный TextView

let возвращает результат лямбды

Позволяет трансформировать объект или выполнить побочные действия.

val userLength: Int = userName?.let { name ->
    println("Обработка: $name")
    name.length  // Возвращается Int (длина строки)
} ?: 0

3. Типичные сценарии использования

Для apply:

  • Конфигурация объектов после создания.
  • Группировка операций установки свойств.
  • Работа с билдерами (например, в Android UI).
val intent = Intent(context, MainActivity::class.java).apply {
    putExtra("KEY_DATA", data)
    flags = Intent.FLAG_ACTIVITY_NEW_TASK
    action = "ACTION_VIEW"
}

Для let:

  • Безопасная работа с nullable-типами (вместо проверок на null).
  • Преобразование значения в другой тип.
  • Выполнение кода только при ненулевом значении.
// Безопасный вызов для nullable
val imageUrl: String? = fetchUrl()
imageUrl?.let { url ->
    loadImage(url)  // Код выполнится только если imageUrl != null
}

4. Практический пример сравнения

data class Device(var name: String? = null, var os: String? = null)

// Использование apply: настройка объекта
val device1 = Device().apply {
    name = "Pixel"
    os = "Android"
} // Возвращает Device

// Использование let: преобразование и проверка на null
val device2: Device? = fetchDevice()
val osInfo: String = device2?.let { device ->
    "${device.name} работает на ${device.os}"
} ?: "Устройство не найдено"

Вывод

Основное различие сводится к:

  • apply — "сделай что-то с этим объектом и верни его же". Используется для конфигурации.
  • let — "возьми этот объект, сделай с ним операцию и верни результат". Используется для трансформации и null-безопасности.

Правильный выбор между ними делает код более читаемым и выразительным, соответствуя принципам Kotlin-стиля.

В чем разница между scope функциями apply и let? | PrepBro