0Pricing
Kotlin Academy · Урок

also: побочные эффекты без изменения получателя

Используйте also для ведения журнала, отладки и операций только с побочными эффектами.

«also: побочные эффекты без изменения получателя» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

also вкратце

also выполняет блок, передавая объект-получатель как it, и возвращает объект-получатель без изменений. Идеально подходит для побочных эффектов — ведения журналов, отладки и проверки — не нарушая цепочку вызовов.

Основы also

also { ... } выполняет побочный эффект и возвращает то же значение, поэтому вызовы естественно образуют цепочку.

fun main() {
    val nums = listOf(1, 2, 3, 4)
        .also { println("input: $it") }
        .filter { it % 2 == 0 }
        .also { println("filtered: $it") }
    println(nums)
}

also для ведения журналов

Добавляйте записи в журнал в середину цепочки вызовов, не нарушая её последовательность.

fun main() {
    val processed = "  Hello, Kotlin!  "
        .also { println("raw: '$it'") }
        .trim()
        .also { println("trimmed: '$it'") }
        .uppercase()
    println(processed)
}

also для отладки

Используйте also, чтобы просмотреть промежуточное состояние во время рефакторинга, а затем удалить его, не меняя цепочку вызовов.

fun main() {
    val sum = (1..5).toList()
        .also { println("list: $it") }
        .sum()
        .also { println("sum: $it") }
    println("final: $sum")
}

also и apply

apply использует this (лучше подходит для присваиваний). also использует it (лучше подходит для явных ссылок и побочных эффектов).

class Counter {
    var value: Int = 0
}
fun main() {
    val c = Counter().apply { value = 10 } // uses this implicitly
    val d = Counter().also { it.value = 10 } // uses it explicitly
    println("${c.value} / ${d.value}")
}

also для побочных эффектов при инициализации

Это удобно, когда при создании объекта нужно что-то с ним сделать, но не требуется устанавливать свойство.

class Repository {
    val cache = mutableMapOf<String, String>()
    fun init() = println("Repository initialized")
}
fun main() {
    val r = Repository().also { it.init() }
    r.cache["key"] = "value"
    println(r.cache)
}

also возвращает исходное значение

Объект-получатель проходит дальше без изменений — его легко включать в цепочку вызовов.

fun main() {
    val len = "Hello".also { println("got: $it") }.length
    println(len) // 5
}

also для проверки

Выполняйте проверки в середине цепочки вызовов.

fun main() {
    val n = listOf(1, 2, 3, 4)
        .filter { it > 0 }
        .also { require(it.isNotEmpty()) { "must have positives" } }
        .sum()
    println(n)
}

Объединение also и let

Используйте also для побочных эффектов, а let — для преобразования в одной и той же цепочке вызовов.

fun main() {
    val raw: String? = "  42  "
    val n = raw
        ?.also { println("raw: '$it'") }
        ?.let { it.trim().toIntOrNull() }
        ?.also { println("parsed: $it") }
    println(n)
}

also для добавления в коллекцию

Добавляйте созданный объект в список непосредственно в цепочке вызовов.

class User(val name: String)
fun main() {
    val users = mutableListOf<User>()
    val ada = User("Ada").also { users.add(it) }
    val ben = User("Ben").also { users.add(it) }
    println(users.map { it.name })
}

Когда использовать also

Выбирайте also, когда нужен побочный эффект (запись в журнал, проверка или регистрация), но необходимо передать исходное значение дальше.

fun main() {
    val total = listOf(10, 20, 30, 40, 50)
        .also { println("count: ${it.size}") }
        .filter { it >= 30 }
        .also { println("kept: $it") }
        .sum()
    println("total: $total")
}

Антишаблон: also для повторного присваивания

Не используйте also, если на самом деле нужно преобразовать значение, — для этого предназначены let и run.

fun main() {
    val name = "ada"
    // BAD: also returns receiver, so upper is wrong
    // val upper = name.also { it.uppercase() } // upper == "ada"
    val upper = name.let { it.uppercase() }
    println(upper) // ADA
}

Быстрая проверка

Какое значение возвращает also после выполнения своего блока?

Итоги

also выполняет блок с побочным эффектом, используя it, и возвращает объект-получатель. Используйте его для ведения журналов, отладки, проверки и регистрации — везде, где нужно посмотреть значение, не изменяя его. Для преобразований используйте вместо него let или run.

Часто задаваемые вопросы

Урок «also: побочные эффекты без изменения получателя» бесплатный?

Да — полный текст урока «also: побочные эффекты без изменения получателя» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «also: побочные эффекты без изменения получателя»?

Используйте also для ведения журнала, отладки и операций только с побочными эффектами. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «also: побочные эффекты без изменения получателя»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. apply и with: настройка и возврат
  2. let и run: преобразование и область видимости
  3. also: побочные эффекты без изменения получателя
  4. Как выбрать подходящую функцию области видимости
← Назад к Kotlin Academy