将两个 kotlin 流组合成一个流,从两个原始流发出最新值?
Combine two kotlin flows into a single flow that emits the latest value from the two original flows?
如果我们有两个这样定义的流:
val someflow = flow {
emit("something")
}
另一个流程定义如下:
val stateFlow = MutableStateFlow("some value")
是否可以将两个流合并为一个流,该流仅发出 someflow
或 stateFlow
发出的最后一个值?
这个想法是 stateFlow
可能会在未来的某个时间发出一个值,但在那之前我只想要 someflow
最后发出的任何值。在“组合”流程中,我只想获取 someflow
发出的第一个值,然后能够观察 stateFlow
.
上的其余更新
这似乎可以通过组合函数来完成,但我只想发出两个流之间的最新发射值,我不关心一个流的最后一个值是什么。
你可以这样使用:
fun <T> Flow<T>.merge(otherFlow: Flow<T>) = flow {
this@merge.collect { value ->
emit(value)
}
otherFlow.collect { value ->
emit(value)
}
}
请注意,只有当两个流都为 completed/canceled 时,生成的流才会完成。
用法:
someFlow.merge(stateFlow).collect {
println(it)
}
有一个 flattenMerge
函数,它将流作为单个流执行,它可能是您需要的。例如:
val numbersFlow = flowOf("1", "2", "3", "4").onEach { delay(1000) }
val lettersFlow = flowOf("A", "B", "C").onEach { delay(2000) }
flowOf(numbersFlow, lettersFlow).flattenMerge().collect {
println("Result $it")
}
打印:
Result 1
Result A
Result 2
Result 3
Result B
Result 4
Result C
所以对于你的情况,它看起来像:
flowOf(someFlow, stateFlow).flattenMerge().collect {
println("Result $it")
}
如果我们有两个这样定义的流:
val someflow = flow {
emit("something")
}
另一个流程定义如下:
val stateFlow = MutableStateFlow("some value")
是否可以将两个流合并为一个流,该流仅发出 someflow
或 stateFlow
发出的最后一个值?
这个想法是 stateFlow
可能会在未来的某个时间发出一个值,但在那之前我只想要 someflow
最后发出的任何值。在“组合”流程中,我只想获取 someflow
发出的第一个值,然后能够观察 stateFlow
.
这似乎可以通过组合函数来完成,但我只想发出两个流之间的最新发射值,我不关心一个流的最后一个值是什么。
你可以这样使用:
fun <T> Flow<T>.merge(otherFlow: Flow<T>) = flow {
this@merge.collect { value ->
emit(value)
}
otherFlow.collect { value ->
emit(value)
}
}
请注意,只有当两个流都为 completed/canceled 时,生成的流才会完成。
用法:
someFlow.merge(stateFlow).collect {
println(it)
}
有一个 flattenMerge
函数,它将流作为单个流执行,它可能是您需要的。例如:
val numbersFlow = flowOf("1", "2", "3", "4").onEach { delay(1000) }
val lettersFlow = flowOf("A", "B", "C").onEach { delay(2000) }
flowOf(numbersFlow, lettersFlow).flattenMerge().collect {
println("Result $it")
}
打印:
Result 1
Result A
Result 2
Result 3
Result B
Result 4
Result C
所以对于你的情况,它看起来像:
flowOf(someFlow, stateFlow).flattenMerge().collect {
println("Result $it")
}