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 — локальная установка не требуется.
Все уроки этого курса
- apply и with: настройка и возврат
- let и run: преобразование и область видимости
- also: побочные эффекты без изменения получателя
- Как выбрать подходящую функцию области видимости