apply и with: настройка и возврат
Используйте apply и with для настройки объектов и разбирайтесь в возвращаемых ими значениях.
«apply и with: настройка и возврат» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Повторение функций области видимости
Функции области видимости Kotlin (apply, also, let, run, with) позволяют выполнить блок в контексте объекта. Каждая из них отличается получателем (this или it) и возвращаемым значением.
Основы apply
apply { ... } выполняет блок, привязывая this к получателю, и возвращает сам получатель. Идеально подходит для настройки объекта.
class Person {
var name: String = ""
var age: Int = 0
}
fun main() {
val p = Person().apply {
name = "Ada"
age = 35
}
println("${p.name}, ${p.age}")
}Почему apply полезна
Без apply Вам потребовалась бы временная переменная, чтобы настроить объект, а затем вернуть его. apply сжимает это до одного выражения.
class Config {
var host: String = ""
var port: Int = 0
}
fun makeConfig(): Config {
// Without apply:
// val c = Config(); c.host = "x"; c.port = 8080; return c
return Config().apply {
host = "localhost"
port = 8080
}
}
fun main() {
val c = makeConfig()
println("${c.host}:${c.port}")
}apply в цепочке
apply возвращает получателя, поэтому после него естественно вызывать другие методы в цепочке.
class Builder {
val parts = mutableListOf<String>()
}
fun main() {
val result = Builder().apply {
parts.add("hello")
parts.add("world")
}.parts.joinToString(" ")
println(result) // hello world
}Основы with
with(receiver) { ... } выполняет блок, где this = получатель, и возвращает результат лямбды (а НЕ получателя). Это полезно, когда Вам нужно вычислить производное значение.
class Rect(val w: Int, val h: Int)
fun main() {
val area = with(Rect(3, 4)) {
w * h
}
println(area) // 12
}apply и with
apply возвращает получателя и идеально подходит для объектов-построителей. with возвращает результат лямбды и идеально подходит для вычислений на основе получателя.
class Box(var width: Int = 0, var height: Int = 0)
fun main() {
val box = Box().apply { width = 10; height = 20 } // returns Box
val area = with(box) { width * height } // returns Int
println("$box area=$area")
}apply со списками
Настраивайте изменяемую коллекцию непосредственно в выражении.
fun main() {
val list = mutableListOf<String>().apply {
add("a")
add("b")
add("c")
}
println(list)
}apply возвращает тот же тип
Тип результата apply всегда совпадает с типом получателя. Явно возвращать значение не нужно.
class Sb {
private val buf = StringBuilder()
fun append(s: String): Sb { buf.append(s); return this }
fun build(): String = buf.toString()
}
fun main() {
val s = Sb().apply {
append("Hello, ")
append("Kotlin!")
}.build()
println(s)
}Повторное использование нескольких членов с with
Внутри with все члены получателя находятся в области видимости — префикс obj. не нужен.
class Person(val name: String, val age: Int)
fun main() {
val description = with(Person("Ada", 35)) {
"Name: $name, Age: $age, AgeNext: ${age + 1}"
}
println(description)
}Вложенный apply
Можно вложить apply в другой apply для иерархической настройки. Используйте это умеренно.
class Address {
var city: String = ""
var zip: String = ""
}
class User {
var name: String = ""
var address: Address = Address()
}
fun main() {
val u = User().apply {
name = "Ada"
address.apply {
city = "Istanbul"
zip = "34000"
}
}
println("${u.name} in ${u.address.city}")
}Когда НЕ следует использовать apply
Если Вам не нужно возвращать получателя, предпочтите обычное создание с именованными аргументами или let/run. Не используйте apply просто ради разнообразия.
class Config(val host: String, val port: Int)
fun main() {
// Named arguments often beat builder + apply:
val cfg = Config(host = "localhost", port = 8080)
println("${cfg.host}:${cfg.port}")
}Быстрая проверка
Что возвращает apply после выполнения своего блока?
Итоги
apply выполняет блок, где this — объект-получатель, и возвращает объект-получатель — идеально подходит для настройки объектов. with выполняет блок, где this — объект-получатель, и возвращает результат лямбды — идеально подходит для получения производных значений. Если настройка проста, используйте именованные аргументы.
Изучай Kotlin с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «apply и with: настройка и возврат» бесплатный?
Да — полный текст урока «apply и with: настройка и возврат» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «apply и with: настройка и возврат»?
Используйте apply и with для настройки объектов и разбирайтесь в возвращаемых ими значениях. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «apply и with: настройка и возврат»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- apply и with: настройка и возврат
- let и run: преобразование и область видимости
- also: побочные эффекты без изменения получателя
- Как выбрать подходящую функцию области видимости