将两个kotlin流合并为一个流,从两个原始流中发出最新值



如果我们有两个这样定义的流:

val someflow = flow {
emit("something")
}

以及另一个定义如下的流程:

val stateFlow = MutableStateFlow("some value")

是否可以将两个流合并为一个流,只发出someflowstateFlow发出的最后一个值?

这个想法是stateFlow可能会在未来的某个时刻发出一个值,但在此之前,我只想要someflow最后发出的值。在";组合的";流,我只想取someflow发出的第一个值,然后能够观察到stateFlow上的其余更新。

这似乎可以通过一个组合函数来实现,但我只想在两个流之间发出最新发出的值,我不在乎一个流的最后一个值是多少。

有一个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")
}

您可以使用这样的东西:

fun <T> Flow<T>.merge(otherFlow: Flow<T>) = flow {
this@merge.collect { value ->
emit(value)
}
otherFlow.collect { value ->
emit(value)
}
}

请注意,只有当两个流都完成/取消时,生成的流才会结束。

用法:

someFlow.merge(stateFlow).collect {
println(it)
}

最新更新