Kotlin 如何';拉链';两个或多个协程通道?
因此,在RxJava中,我们可以简单地执行以下操作: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
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可观察对象是冷流一样,并且对于几乎所有的用例都足够了。另一方面,通道只能用作低电平和其他一些用例。