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

В чем разница между apply и with?

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

Комментарии (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 ссылается на переданный объект.
  • Возвращаемое значение: результат последнего выражения блока (может быть любым типом).
  • Использование: полезно для выполнения операций над объектом без возврата самого объекта (например, сериализация, формирование строки).

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

Критерийapplywith
Тип функцииФункция-расширение (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
}

Важные нюансы

  1. Обработка null: apply безопасен для nullable-объектов, with — нет (требует проверки или использования with с safe-call).
  2. Читаемость: apply часто делает код более читаемым при цепочке вызовов благодаря возврату объекта.
  3. Идиоматичность: в Kotlin принято использовать apply для настройки объектов, а with — для группировки логики работы с объектом.

Вывод

Выбор между apply и with зависит от цели операции:

  • Используйте apply, когда нужно настроить объект и получить его обратно.
  • Используйте with, когда нужно выполнить блок кода с объектом и получить результат вычислений.

Обе функции способствуют написанию более декларативного и лаконичного кода, уменьшая необходимость в явных ссылках на объект и временных переменных.

В чем разница между apply и with? | PrepBro