Обход канала в Kotlin
После серии send и close в буфере
может остаться несколько значений. Забирать их
по одному вручную утомительно; канал поддерживает
обход через for, как коллекцию.
Цикл читает элементы по порядку и сам останавливается, когда канал закрыт и данных больше нет. Так обрабатывают всю очередь без явных проверок конца:
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val pipe = Channel<Int>(3)
pipe.send(1)
pipe.send(2)
pipe.send(3)
pipe.close()
for (n in pipe) {
println(n)
}
}
}
На отдельных строках появятся 1, 2
и 3. После последнего элемента цикл
завершается: закрытый пустой канал больше не
дает итераций.
Тот же прием работает со строками и накоплением результата в переменной перед печатью итога:
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val tags = Channel<String>(2)
tags.send("north")
tags.send("south")
tags.close()
var joined = ""
for (tag in tags) {
joined += tag + " "
}
println(joined.trim())
}
}
Вывод содержит обе метки через пробел. Обход не
требует receiveCatching: механизм итерации
сам учитывает закрытие после последнего
элемента.
Заполните канал символов "a", "b",
"c" с буфером на три элемента, закройте
его и напечатайте каждый символ циклом
for.
Канал целых с вместимостью 2 получает
7 и 8, затем закрывается.
Сложите все числа из обхода и выведите сумму.