如何按顺序连接多个 Kotlin 流?

How to concat multiple Kotlin Flows sequencially?

我正在寻找一种顺序订阅多个 Kotlin Flow 的方法,类似于 rxjs 的 concat 运算符。只有在上一个流程完成后才能订阅下一个流程。

示例:

val flow1 = flowOf(0,1,2).onEach { delay(10) }
val flow2 = flowOf(3,4,5).onEach { delay(10) }

runBlocking{
    listOf(flow1,flow2)
        .merge()
        .onEach { println(it) }
        .collect()
}

-> prints 0,3,1,4,2,5 // Flow order is not preserved

我想一个解决方案可能是用 concat() 替换 merge(),但遗憾的是 Kotlin Flows 中不存在这个运算符

val flow1 = flowOf(0,1,2).onEach { delay(10) }
val flow2 = flowOf(3,4,5).onEach { delay(10) }

runBlocking{
    listOf(flow1,flow2)
        .concat()
        .onEach { println(it) }
        .collect()
}

-> prints 0,1,2,3,4,5 // Flow order is now preserved

您正在寻找 flattenConcat

它有一个 Flow<Flow<T>> 接收器,但您可以轻松地从流列表中创建一个 Flow,例如使用 list.asFlow()。或者您可以使用 flowOf 而不是 listOf.

直接创建 Flow 而不是列表