Kotlin文档使用术语consume
来描述诸如Channel#first()
之类的方法的行为以及诸如Channel#consumeEach()
之类的方法的名称。
我很难理解使用通道与不使用通道的含义。
非消费甚至是什么样?
Channel API是否允许无需消耗就访问通道中的项目?
除了consumeEach()
之外,消费量是否总是意味着完全清空一个频道?
答案 0 :(得分:1)
使用“ consume”表示这是一个终端操作,该命令之外的任何内容都无法从通道读取。您可以在first
和consumeEach
的API文档中看到以下内容:
操作是终端。此功能消耗了原始ReceiveChannel的所有元素。
请注意,文档中还警告该API将来会更改。
阅读KT-167,以获取有关此主题的有用评论。
答案 1 :(得分:0)
以下代码的输出说明了“消费”的含义和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
的数字,我们也无法停止并继续。