如何将 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 完成此操作?
两个重要的约束条件:
- 索引的更改应传播到最终流;
- 对任何
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>
对象,即使索引同时存在于新旧索引列表中。为每个索引创建某种详细信息流缓存可能会更好。
我有数据库查询 returns 某天的 对象索引列表 ,即:
getIndexesOfDay(day: Day): Flow<List<String>>
现在,我需要监听每个索引的详细信息,例如:
getDetailsByIndex(index: String): Flow<Details>
所以问题是:如何使用 Flows 完成此操作?
两个重要的约束条件:
- 索引的更改应传播到最终流;
- 对任何
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>
对象,即使索引同时存在于新旧索引列表中。为每个索引创建某种详细信息流缓存可能会更好。