Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何';拉链';两个或多个协程通道?_Kotlin_Kotlin Coroutines - Fatal编程技术网

Kotlin 如何';拉链';两个或多个协程通道?

Kotlin 如何';拉链';两个或多个协程通道?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,因此,在RxJava中,我们可以简单地执行以下操作: Observable.zip(someObservable, anotherObservable, BiFunction { a, b -> //do something }.subscribe { // do something } 我们如何使用Kotlin协同线路频道做同样的事情?虽然不是理想的解决方案,但似乎很有效 @ExperimentalCoroutinesApi private fun <T, R> Corou

因此,在RxJava中,我们可以简单地执行以下操作:

Observable.zip(someObservable, anotherObservable, BiFunction { a, b -> //do something }.subscribe { // do something }

我们如何使用Kotlin协同线路频道做同样的事情?

虽然不是理想的解决方案,但似乎很有效

@ExperimentalCoroutinesApi
private fun <T, R> CoroutineScope.zipChannels(
    channel1: ReceiveChannel<T>,
    channel2: ReceiveChannel<T>,
    zip: (T, T) -> R
): ReceiveChannel<R> = produce {
    val iterator1 = channel1.iterator()
    val iterator2 = channel2.iterator()
    while (iterator1.hasNext() && iterator2.hasNext()) {
        val value1 = iterator1.next()
        val value2 = iterator2.next()
        send(zip(value1, value2))
    }
    channel1.cancel()
    channel2.cancel()
    close()
}
@experimentalRoutinesAPI
private fun CoroutineScope.zipChannel(
频道1:接收频道,
频道2:接收频道,
齐普:(T,T)->R
):ReceiveChannel=product{
val iterator1=channel1.iterator()
val iterator2=channel2.iterator()
while(iterator1.hasNext()&&iterator2.hasNext()){
val value1=iterator1.next()
val value2=iterator2.next()
发送(zip(值1、值2))
}
渠道1.取消()
渠道2.取消()
关闭()
}
更新


此外,还有一个不推荐使用的运算符

,因此要合并频道,我们需要另一个频道。没有正式的方法吗?但这很有意义。我认为稍后我们将使用比通道更多的流。Flow具有现成的“zip”操作符。但流动是冰冷的溪流。我们应该为热溪流做些什么?是的,你是对的。我完全忘记了。但看看我发现了什么,我想我现在明白了为什么这些操作符只在流中定义了。这是因为作为冷流的流就足够了,就像RxJava可观察对象是冷流一样,并且对于几乎所有的用例都足够了。另一方面,通道只能用作低电平和其他一些用例。