kotlin - 如何 'zip'两个或更多协程 channel ?

标签 kotlin kotlin-coroutines

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

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

我们如何使用Kotlin Coroutine Channels做同样的事情?

最佳答案

不是理想的解决方案,但似乎可行

@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()
}

更新

另外,不推荐使用运算符zip

关于kotlin - 如何 'zip'两个或更多协程 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56948696/

相关文章:

java - 如何访问同一android项目另一个文件夹中另一个类的变量?

kotlin - Kotlin 协程的 Jacoco 代码覆盖率不正确

android - 如何使用 Retrofit 和 Kotlin 协程下载 PDF 文件?

android - Room Dao LiveData 作为返回类型导致编译时错误

kotlin - 如何处理 Kotlin Jetpack Paging 3 异常?

android - RxJava - 如何查看 Flowable 和背压的作用?

Android Mp Android 图表定制设计

android - 从 StateFlow 收集状态

android - 使用 withContext 方法在 kotlin 协程中进行 try-catch

android - 使用 Gson 序列化时忽略主键