Отложенные шаги в Kotlin
Промежуточный шаг последовательности описывает, что сделать с каждым элементом, но не обязан выполняться сразу после записи цепочки. Пока нет конечного действия, тело шага может даже не вызываться.
В map добавим печать номера элемента и умножение,
а конечный шаг намеренно не вызовем:
fun main() {
val data = listOf(1, 2, 3)
val pending = data.asSequence().map {
println("map $it")
it * 10
}
println("built")
}
В консоли появится только строка "built".
Сообщения "map …" не печатаются: цепочка
сохранена, но элементы еще не просили.
Если после построения вызвать toList, картина
меняется - шаги выполняются по мере необходимости:
fun main() {
val data = listOf(1, 2, 3)
val pending = data.asSequence().map {
println("map $it")
it * 10
}
println("built")
println(pending.toList())
}
Сначала снова печатается "built", затем идут
три строки "map", и только потом список
умноженных чисел. Побочный эффект внутри map
привязан к моменту, когда конечное действие реально
тянет элементы из цепочки.
Дан список строк "a", "bb", "ccc".
На шаге отбора печатайте длину каждой строки.
Сначала соберите цепочку без конечного шага и
напечатайте "wait". Затем получите список
строк длиннее одного символа и выведите его.
Для чисел 4, 5 и 6 опишите
последовательность, где на шаге преобразования
печатается удвоенное значение. Выведите
"start", затем сумму элементов и
"end". Сверьте порядок строк в консоли.