如何合并这些Kotlin流?

mi7gmzs6  于 2023-05-07  发布在  Kotlin
关注(0)|答案(1)|浏览(130)

考虑以下方法:

// Returns a Flows of integers. Each integer is a unique id for a Foo.
// Emits a new integer whenever the current Foo changes.
suspend fun getCurrentFooId(): Flow<Int>
// Returns a Foo.
// Emits a new Foo if the internal state of the last Foo changes.
suspend fun getFooForId(int: fooId): Flow<Foo>

我需要的是一个Flow<Foo>,如果当前Foo id更改***或***当前Foo的内部状态更改,则会发出新的Foo
我不能只合并Flow s,因为我不能调用getFooForId(),直到***在***之后我开始收集第一个Flow(因为它提供了Foo id)。
我应该使用通道流来并发合并它们吗?或者有更好的方法吗?

46scxncf

46scxncf1#

那会是

val fooFlow: Flow<Foo> = getCurrentFooId().flatMapLatest { getFooForId(it) }

“平面Map”意味着对于源流中的每个项,从lambda发出所产生的流的所有项。而“latest”意味着每当源流发出一个新值时,就向前跳到新产生的流。
实际上,这两个函数不应该标记为suspend。它通常不需要调用任何阻塞或挂起函数来产生流,并且能够在不需要在协同程序中执行的情况下获得流,这要灵活得多。通常,您可能希望使用launchIn获取流并收集它,这样就不必将其嵌套在协程中,或者使用shareIn创建热流。如果你要把它赋给一个类属性,这个函数特别有用。

相关问题