with
Группируйте операции
«with» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Функция with
with — это функция области видимости, которая принимает объект как аргумент (а не как получатель вызова) и выполняет блок, используя этот объект как this. Она возвращает результат лямбды.
Базовое использование with
Передайте объект в with и обращайтесь к его членам напрямую внутри блока.
fun main() {
val name = "Kotlin"
val description = with(name) {
"$this has $length characters"
}
println(description)
}Группировка нескольких операций
with особенно удобна, когда нужно вызвать несколько методов или прочитать несколько свойств одного объекта. Она избавляет от необходимости повторять имя объекта.
fun main() {
val sb = StringBuilder()
with(sb) {
append("Line 1\n")
append("Line 2\n")
append("Line 3")
}
println(sb)
}with использует this
Как и run с apply, with предоставляет доступ к объекту через this, поэтому для обращения к членам объекта не нужен префикс.
data class Rectangle(val width: Int, val height: Int)
fun main() {
val rect = Rectangle(4, 5)
val area = with(rect) {
width * height
}
println("Area: $area")
}with возвращает результат лямбды
Значение последнего выражения в блоке становится результатом with, так же как и у run.
fun main() {
val list = listOf(1, 2, 3, 4, 5)
val summary = with(list) {
"Size=$size, First=${first()}, Last=${last()}"
}
println(summary)
}with и run
with(obj) { ... } и obj.run { ... } делают почти одно и то же. Различие заключается в синтаксисе:
run— это расширение, вызываемое для объекта, поэтому оно хорошо работает с безопасными вызовами.withпринимает объект как аргумент и естественно читается как «работая с этим объектом, выполните…».
fun main() {
val s = "data"
val a = with(s) { uppercase() }
val b = s.run { uppercase() }
println("$a $b")
}with не предназначена для nullable-значений
Поскольку объект передаётся как аргумент, with плохо сочетается с оператором безопасного вызова. Для получателей, допускающих null, предпочтительнее использовать obj?.run { } или obj?.let { }.
fun main() {
val name: String? = "Eve"
name?.run { println("Hello $this") }
println("with is awkward for nullables")
}Одновременное чтение и вычисление
Распространённый шаблон — прочитать несколько свойств и вычислить один результат в одном понятном блоке.
data class Order(val items: Int, val pricePerItem: Int)
fun main() {
val order = Order(3, 20)
val total = with(order) {
items * pricePerItem
}
println("Total: $total")
}Построение строк с with
В сочетании с buildString или StringBuilder функция with позволяет создавать понятный код построения строк без префиксов.
fun main() {
val report = StringBuilder()
with(report) {
appendLine("Report")
appendLine("======")
appendLine("All good")
}
print(report)
}with для коллекции
Можно вызвать несколько функций коллекции для одного списка, не повторяя его имя.
fun main() {
val numbers = listOf(10, 20, 30)
with(numbers) {
println("Sum: ${sum()}")
println("Max: ${max()}")
println("Average: ${average()}")
}
}Когда использовать with
Выбирайте with, когда у вас есть объект, не равный null, и нужно выполнить над ним группу операций, при необходимости возвращая результат. Эта функция сообщает: «Я некоторое время работаю с этим объектом».
Быстрая проверка
Как with получает свой объект?
Итоги
with группирует операции над одним объектом, не равным null, который передаётся как аргумент, предоставляет доступ к нему через this и возвращает результат лямбды. Эта функция похожа на run, но использует синтаксис с аргументом. Далее вы узнаете, как выбирать подходящую функцию области видимости для каждой ситуации.
Часто задаваемые вопросы
Урок «with» бесплатный?
Да — полный текст урока «with» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «with»?
Группируйте операции Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «with»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.