将多个 Flow<List<T>> 合并为一个 Flow<Map<String, List<T>>>
Combine multiple Flow<List<T>> to a Single Flow<Map<String, List<T>>>
我正在尝试将 Room 数据库中来自不同 @Query 的多个流结果转换为这些结果列表的映射流。像这样:
fun getA(): Flow<List<T>> // query 1
fun getB(): Flow<List<T>>// query 2
我试过这样做:
fun getMappedList(): Flow<Map<String, List<T>>> {
val mapList = mutableMapOf<String, List<T>>()
return flow {
getA().map{
mapList["A"] = it
}
getB().map{
mapList["B"] = it
}
emit(mapList)
}
}
但显然这似乎不起作用。我如何实现这一目标的任何想法。非常感谢
我还没有真正使用过 Flow
api,但是像这样的东西应该有用:
fun getMappedList(): Flow<Map<String, List<Int>>>
= getA().combine(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
或者根据您的用例,您可能希望使用 zip
运算符,作为唯一的“对”发出:
fun getMappedList(): Flow<Map<String, List<Int>>>
= getA().zip(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
测试使用:
fun getA(): Flow<List<Int>> = flow { emit(listOf(1)) }
fun getB(): Flow<List<Int>> = flow { emit(listOf(2)); emit(listOf(3)) }
fun getCombine(): Flow<Map<String, List<Int>>>
= getA().combine(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
fun getZip(): Flow<Map<String, List<Int>>>
= getA().zip(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
收集器中 combine
的输出(结合来自任一流的最新值):
{A=[1], B=[2]}
{A=[1], B=[3]}
收集器中 zip
的输出(每个流的排放量压缩对):
{A=[1], B=[2]}
更新
再使用 api 之后,您可以使用 combine
,它可以占用 n
个 Flow<T>
:
val flowA = flow<Int> { emit(1) }
val flowB = flow<Int> { emit(2) }
val flowC = flow<Int> { emit(3) }
combine(flowA, flowB, flowC, ::Triple)
我正在尝试将 Room 数据库中来自不同 @Query 的多个流结果转换为这些结果列表的映射流。像这样:
fun getA(): Flow<List<T>> // query 1
fun getB(): Flow<List<T>>// query 2
我试过这样做:
fun getMappedList(): Flow<Map<String, List<T>>> {
val mapList = mutableMapOf<String, List<T>>()
return flow {
getA().map{
mapList["A"] = it
}
getB().map{
mapList["B"] = it
}
emit(mapList)
}
}
但显然这似乎不起作用。我如何实现这一目标的任何想法。非常感谢
我还没有真正使用过 Flow
api,但是像这样的东西应该有用:
fun getMappedList(): Flow<Map<String, List<Int>>>
= getA().combine(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
或者根据您的用例,您可能希望使用 zip
运算符,作为唯一的“对”发出:
fun getMappedList(): Flow<Map<String, List<Int>>>
= getA().zip(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
测试使用:
fun getA(): Flow<List<Int>> = flow { emit(listOf(1)) }
fun getB(): Flow<List<Int>> = flow { emit(listOf(2)); emit(listOf(3)) }
fun getCombine(): Flow<Map<String, List<Int>>>
= getA().combine(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
fun getZip(): Flow<Map<String, List<Int>>>
= getA().zip(getB()) { a, b -> mapOf(Pair("A", a), Pair("B", b)) }
收集器中 combine
的输出(结合来自任一流的最新值):
{A=[1], B=[2]}
{A=[1], B=[3]}
收集器中 zip
的输出(每个流的排放量压缩对):
{A=[1], B=[2]}
更新
再使用 api 之后,您可以使用 combine
,它可以占用 n
个 Flow<T>
:
val flowA = flow<Int> { emit(1) }
val flowB = flow<Int> { emit(2) }
val flowC = flow<Int> { emit(3) }
combine(flowA, flowB, flowC, ::Triple)