Вывод следующего кода иллюстрирует значение «потребления» и эффект consumeEach
.
fun f1() = runBlocking {
val numbers = produce {
repeat(5) {
send(it)
delay(100)
}
}
run {
for (i in numbers) {
trace(i)
if (i == 2) return@run
}
}
trace("after run")
for (i in numbers) {
trace(i)
}
trace("exiting f1")
}
f1()
println()
fun f2() = runBlocking {
val numbers = produce {
repeat(5) {
send(it)
delay(100)
}
}
run {
numbers.consumeEach {
trace(it)
if (it == 2) return@run
}
}
trace("after run")
for (i in numbers) {
trace(i)
}
trace("exiting f2")
}
f2()
Вывод:
[main @coroutine#1]: 0
[main @coroutine#1]: 1
[main @coroutine#1]: 2
[main @coroutine#1]: after run
[main @coroutine#1]: 3
[main @coroutine#1]: 4
[main @coroutine#1]: exiting f1
[main @coroutine#3]: 0
[main @coroutine#3]: 1
[main @coroutine#3]: 2
[main @coroutine#3]: after run
[main @coroutine#3]: exiting f2
Мы видим, что (в f1) мы можем прекратить итерации по каналу, а затем продолжить, где мы остановились.Однако при использовании consumeEach
(в f2) мы не можем остановиться и продолжить, даже если канал изначально был способен генерировать числа, превышающие 2
.