如何将 Flow<List<Flow<T>>> 转换为 Flow<List<T>>

How to transform Flow<List<Flow<T>>> to Flow<List<T>>

我有数据库查询 returns 某天的 对象索引列表 ,即:

getIndexesOfDay(day: Day): Flow<List<String>>

现在,我需要监听每个索引的详细信息,例如:

getDetailsByIndex(index: String): Flow<Details>

所以问题是:如何使用 Flows 完成此操作?

两个重要的约束条件:

  1. 索引的更改应传播到最终流;
  2. 对任何 Details 对象的更改也应该更新流程。

我已经尝试过的:

getIndexesOfDay(todayDay)
          .map { indexes ->
              indexes?.map {
                      mIndex->
                  getDetailsByIndex(mIndex)
              }
          }

但它 returns 一个 Flow<List<Flow<Details>>> 而不是所需的 Flow<List<Details>>

感谢任何帮助!

我还没有测试过,但我相信使用 flatMapLatest() and combine():

应该是可能的
getIndexesOfDay(todayDay)
    .flatMapLatest { indexes ->
        combine(indexes.map { getDetailsByIndex(it) }) { it.asList() }
    }

对于每个新的索引列表,它会多次调用getDetailsByIndex()以获取流列表,然后将这些流组合成一个详细信息流列表。

缺点是每当索引更改时,它都会丢弃所有 Flow<Details> 对象,即使索引同时存在于新旧索引列表中。为每个索引创建某种详细信息流缓存可能会更好。