2

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

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

另一个流程定义如下:

val stateFlow = MutableStateFlow("some value")

是否可以将两个流组合成一个流,该流仅发出由someflow或发出的最后一个值stateFlow

这个想法stateFlow可能会在未来的某个时候发出一个值,但在那之前我只想要someflow最后发出的任何值。在“组合”流程中,我只想获取由 发出的第一个值,someflow然后能够观察stateFlow.

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

4

2 回答 2

2

有一个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")
}
于 2022-01-14T12:41:25.687 回答
0

你可以使用这样的东西:

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)
}
于 2022-01-14T06:33:46.623 回答