Побочное действие в Kotlin
Функция also передает объект в лямбду как it
и после блока возвращает тот же экземпляр. Последнее
выражение внутри лямбды на результат вызова не
влияет - наружу снова идет исходный объект:
data class Ticket(val code: String)
fun main() {
val ticket = Ticket("T7").also {
println("saved ${it.code}")
}
println(ticket.code)
}
Такой вызов удобен для журнала или проверки, когда менять поля объекта не нужно, а дальше работают с тем же значением:
data class Ticket(val code: String)
fun main() {
val list = mutableListOf<Ticket>()
val ticket = Ticket("K2").also {
list.add(it)
}
println(list.size)
println(ticket.code)
}
Несколько побочных шагов можно поставить в цепочку, если каждый звено возвращает тот же тип:
data class Ticket(val code: String)
fun main() {
val ticket = Ticket("P1")
.also { println("step1 ${it.code}") }
.also { println("step2 ${it.code}") }
println(ticket.code)
}
Создайте Order с номером "44".
Выведите строку "log 44" в момент
создания, не меняя поля заказа, и затем
напечатайте номер из той же переменной.
Есть изменяемый список строк. Добавьте в него
"alpha" через scope-вызов у литерала
строки так, чтобы в переменной осталась та же
строка "alpha", а размер списка стал
1.