gpt4 book ai didi

kotlin - 如何正确实现这个 kotlin ReceiveChannel 代码

转载 作者:行者123 更新时间:2023-12-02 13:20:30 24 4
gpt4 key购买 nike

我正在学习一个教程,其中老师使用 ProducerJob 方法来演示 kotlin 协程,但我的 IDE 说该方法已被弃用,我应该使用 ReceiveChannel 代替,但这也是说我应该在协程范围上使用扩展,但我似乎无法正确实现它。

这里是讲师的代码:

fun produceNumbers() : ProducerJob<Int> = produce {

for (x in 1..5) {
println("send $x")
send(x)
}
println("Done")

}

fun main() = runBlocking{
val channel = produceNumbers()
channel.consumeEach {
println(it)
}
println("Main done")

}

这是我的代码:

fun produceNumbers() : ReceiveChannel<Int> = produce {

for (x in 1..5) {
println("send $x")
send(x)
}
println("Done")

}

fun main() = runBlocking{
val channel = produceNumbers()
channel.consumeEach {
println(it)
}
println("Main done")

}

您的代码是否编译:是版本:kotlinx-coroutines-core-0.27.0.eap13

最佳答案

之所以建议将您的函数声明为 CoroutineScope 的扩展,是因为您无论如何都需要一个用于任何创建协程的内置函数的作用域。您不应该在没有作用域的情况下调用 produce,它不应该在最新版本的 Kotlin 协程库中编译。

将您的函数声明为 CoroutineScope 的扩展是这样完成的:

fun CoroutineScope.produceNumbers() : ReceiveChannel<Int> = produce {
for (x in 1..5) {
println("send $x")
send(x)
}
println("Done")
}

如果您没有在 CoroutineScope 的扩展中使用它,那么您需要以另一种方式提供作用域(例如封闭类的字段或方法参数),或者使用GlobalScope,两者都不推荐。上面基于扩展的版本是协程用户可识别且直观的模式。

一种更“ react 性”的方法是使用 flows而不是 channel :

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun produceNumbers() : Flow<Int> = flow {
for (x in 1..5) {
println("emit $x")
emit(x)
}
println("Done")
}

fun main() = runBlocking {
val flow = produceNumbers()
flow.collect {
println(it)
}
println("Main done")
}

请注意,这会有所不同,因为它不会在并发协程中启动,除非明确说明(例如使用 flowOn(Dispatchers.Default),或用 channelFlow {...} 替换 flow {...} .

关于kotlin - 如何正确实现这个 kotlin ReceiveChannel 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57535917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com