【问题标题】:No support for zipping multiple Flows in Kotlin?不支持在 Kotlin 中压缩多个流?
【发布时间】:2022-01-10 01:26:53
【问题描述】:

当我们试图从 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(flow1,flow2,flow3) 但是我没有找到任何这样的工具。

让我感到奇怪的是,我在堆栈或任何 Kotlin Flows 教程中都没有找到很多问题来询问我在问什么。

这让我觉得我一定是做错了什么,并且可能有一个替代工具来压缩多个流。

有什么提示吗?

【问题讨论】:

  • 我猜鲍里斯你没有仔细阅读我的查询
  • 也许是combine? (顶级函数)
  • 您的意思是多于两个流吗? zip 函数 Boris 链接的功能与 Rx 的 zip 相同,尽管它仅适用于两个项目。当您说他们没有仔细阅读时,我不确定您的意思。 combine 做一些不同于压缩的事情。对于最慢源发出的每个项目,压缩仅发出一个组合项目。组合为任何源发出的每个项目发出一个组合项目,一旦它们都至少发出一次。
  • 协程标准库包含一组最小的运算符,以符合反应式编程。我不知道他们是否打算稍后添加更详细的运算符,但他们表示当前的理念是在核心库中保持最小化。

标签: kotlin kotlin-coroutines


【解决方案1】:

您可以在 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)

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多