Комментарии (2)
🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между apply и with в Kotlin
Оба apply и with являются scope-функциями в Kotlin, предназначенными для выполнения блока кода в контексте объекта, но они имеют ключевые различия в способе получения контекста и возвращаемом значении.
Основные характеристики apply
apply — это функция-расширение (T.apply()), которая принимает лямбду с получателем (this). Она возвращает сам объект-получатель после выполнения блока.
val person = Person().apply {
name = "Иван"
age = 30
city = "Москва"
}
// person содержит экземпляр Person с заданными полями
- Контекст: внутри лямбды
thisссылается на объект-получатель. - Возвращаемое значение: сам объект-получатель (
Personв примере). - Использование: идеально для конфигурации объектов при создании (например, настройка View в Android).
Основные характеристики with
with — не функция-расширение, а обычная функция, принимающая объект и лямбду. Она возвращает результат последнего выражения в лямбде.
val person = Person("Иван", 30)
val description = with(person) {
"Имя: $name, возраст: $age"
}
// description содержит строку, сформированную в лямбде
- Контекст: внутри лямбды
thisссылается на переданный объект. - Возвращаемое значение: результат последнего выражения блока (может быть любым типом).
- Использование: полезно для выполнения операций над объектом без возврата самого объекта (например, сериализация, формирование строки).
Ключевые различия в таблице
| Критерий | apply | with |
|---|---|---|
| Тип функции | Функция-расширение (T.apply()) | Обычная функция (with(T, ...)) |
| Приемник (receiver) | Явный (вызывается на объекте) | Явный (передается первым аргументом) |
| Возвращаемое значение | Сам объект-получатель | Результат последнего выражения в лямбде |
| Типичное применение | Инициализация/конфигурация объектов | Выполнение операций над уже существующим объектом |
Практические примеры в Android
Пример с apply (настройка View)
val button = Button(context).apply {
text = "Нажми меня"
textSize = 16f
setOnClickListener {
showToast("Клик!")
}
}
// button готов к использованию
Пример с with (работа с ресурсами)
val sharedPrefs = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
with(sharedPrefs.edit()) {
putString("token", "abc123")
putBoolean("logged_in", true)
apply() // возвращает Unit, но нам важен side-effect
}
Важные нюансы
- Обработка null:
applyбезопасен для nullable-объектов,with— нет (требует проверки или использованияwithс safe-call). - Читаемость:
applyчасто делает код более читаемым при цепочке вызовов благодаря возврату объекта. - Идиоматичность: в Kotlin принято использовать
applyдля настройки объектов, аwith— для группировки логики работы с объектом.
Вывод
Выбор между apply и with зависит от цели операции:
- Используйте
apply, когда нужно настроить объект и получить его обратно. - Используйте
with, когда нужно выполнить блок кода с объектом и получить результат вычислений.
Обе функции способствуют написанию более декларативного и лаконичного кода, уменьшая необходимость в явных ссылках на объект и временных переменных.