Комментарии (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=Москва)
}
В этом примере:
- Создаётся объект
Personс именем "Анна". - Функция
applyвызывается для этого объекта, и внутри лямбды мы устанавливаем свойстваageиcity. Контекстный объект — это сам объектPerson, доступный какthis. 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).