不支持在Kotlin压缩多个Flow



当我们试图从RxJ转移到kotlin Flows时,我真的很惊讶,因为没有任何设施来压缩多个流。

val flow1= (1..3).asFlow().onEach {delay(1000)}
val flow2= (1..3).asFlow().onEach {delay(2000)}
val flow3= (1..3).asFlow().onEach {delay(3000)}

我正在寻找Rx风格的Flow.zip(流程1、流程2、流程3(,但我没有找到任何这样的设施。

奇怪的是,我在这里的stack或任何Kotlin Flows教程中都没有发现很多问题在问我。

这让我觉得我一定做错了什么,可能有另一种方法可以压缩多个流。

有什么提示吗?

您可以在zip之上为两个流构建自己的

inline fun <A, B, C, D> Flow<A>.zip(
flowB: Flow<B>,
flowC: Flow<C>,
crossinline f: (A, B, C) -> D
): Flow<D> =
zip(flowB, ::Pair).zip(flowC) { (a, b), c -> f(a, b, c) }

用法:

suspend fun main() {
val one = flowOf(0, 1, 2, 3)
val two = flowOf("a", "b", "c", "d")
val three = flowOf(5.0, 6.0, 7.0)
one.zip(two, three, ::Triple).collect(::print)
// prints (0, a, 5.0)(1, b, 6.0)(2, c, 7.0)
}

可能不如直接实现高效,但根据您的用例,它可能足够好了。

最新更新