如何按顺序连接多个Kotlin流



我正在寻找一种按顺序订阅多个Kotlin流的方法,类似于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

您正在寻找flatchnCcat。

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

最新更新