如何使用Kotlin Flow提供的flatMapMerge?

时间:2019-09-09 15:48:24

标签: android kotlin kotlin-coroutines

我有这些代码,我希望它可以使其更优化

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

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

和fetchColumns()是暂停的函数 我在想也许我需要查询流程?使用flatMapMerge()的方式是什么?

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

1 个答案:

答案 0 :(得分:0)

尝试使用类似这样的内容:

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

由于您无需切换到其他流程,因此不需要任何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)