如何按顺序连接多个 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
而不是列表
我正在寻找一种顺序订阅多个 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
而不是列表