如何从 kotlin flow 使用 flatMapMerge?

Art*_*r A 3 android kotlin kotlin-coroutines

我有这些代码,我希望它能够使其更加优化

我想我可以使用 kotlin-flow 的 flatMapMerge 但我不认为我应该如何将我的代码转换为 flow

  val quiries = listof("s","b","s","g","d","r","t")
    quiries.map { query ->
      viewModelScope.launch {
        val results = fetchColumns(query)
        resultMutableData.postValue(results)
      }
    }

Run Code Online (Sandbox Code Playgroud)

和 fetchColumns() 是挂起的函数,我想也许我需要查询流???使用 flatMapMerge() 的方法是什么?

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-merge.html

Sta*_*lov 6

尝试使用这样的东西:

listOf("s","b","s","g","d","r","t").asFlow()
    .map { fetchColumns(it) }
    .onEach { resultMutableData.postValue(it) }
    .launchIn(viewModelScope)
Run Code Online (Sandbox Code Playgroud)

由于您不切换到另一个流程,因此不需要任何flatMap*功能,map就足够了。此外,map参数已经声明为suspend,所以你不会阻塞你的线程。但map运算符被设计为顺序处理数据,因此这些转换不会并行运行。为了实现并行处理,flatMapMerge可以使用以下解决方法:

listOf("s","b","s","g","d","r","t").asFlow()
    .onEach { println("onEach: $it") }
    .flatMapMerge {
        flow {
            emit(fetchColumns(it))
        }
    }
    .onEach { resultMutableData.postValue(it)) }
    .launchIn(viewModelScope)
Run Code Online (Sandbox Code Playgroud)