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

Что возвращает apply?

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

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

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

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

Что возвращает функция apply в Kotlin?

Функция apply — это одна из scope-функций (функций-областей видимости) в Kotlin, которая возвращает сам объект (this), для которого она была вызвана, после выполнения переданного лямбда-выражения.

Основные характеристики apply:

  • Контекстный объект: внутри лямбды объект доступен через this (или может быть опущен).
  • Возвращаемое значение: всегда сам объект (ресивер), над которым вызывается apply.
  • Цель использования: удобна для инициализации или настройки объекта.

Пример кода с объяснением:

data class Person(var name: String, var age: Int = 0, var city: String = "")

fun main() {
    val person = Person("Анна").apply {
        age = 30
        city = "Москва"
        // Дополнительные действия, например, логирование:
        println("Настройка объекта: $this")
    }
    
    println(person) // Вывод: Person(name=Анна, age=30, city=Москва)
}

В этом примере:

  1. Создаётся объект Person с именем "Анна".
  2. Функция apply вызывается для этого объекта, и внутри лямбды мы устанавливаем свойства age и city. Контекстный объект — это сам объект Person, доступный как this.
  3. apply возвращает тот же объект Person после выполнения лямбды, поэтому person в результате содержит все изменения.

Ключевые особенности возвращаемого значения:

  • Тип возврата: совпадает с типом исходного объекта. Например, если вызвать apply для StringBuilder, то вернётся StringBuilder.
  • Цепочка вызовов: поскольку apply возвращает сам объект, её можно использовать для цепочки операций, хотя обычно для цепочек предпочтительнее also или let (чтобы избежать путаницы с this).
  • Изменение состояния: apply позволяет модифицировать объект, но не возвращает новый результат, как, например, let или run.

Сравнение с другими scope-функциями:

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

Пример для наглядности разницы:

val list = mutableListOf<Int>().apply {
    add(1)
    add(2)
} // Возвращает тот же MutableList<Int> с элементами [1, 2]

val size = mutableListOf<Int>().let {
    it.add(1)
    it.size
} // Возвращает 1 (результат лямбды — it.size), а не объект списка

Практическое применение apply:

  • Инициализация объектов, особенно с множеством свойств, например, при создании UI-компонентов в Android:
val button = Button(context).apply {
    text = "Нажми меня"
    textSize = 16f
    setOnClickListener { /* обработка клика */ }
} // button — это настроенный объект Button
  • Конфигурация билдеров (например, AlertDialog в Android).
  • Установка свойств для объектов, которые не поддерживают именованные аргументы в конструкторе.**

Итог: apply возвращает сам объект-ресивер после применения к нему операций из лямбды, что удобно для инициализации и настройки объектов без создания дополнительных переменных. Это отличает её от функций, возвращающих результат лямбды (например, let или run).

Что возвращает apply? | PrepBro