1

Room データベースの異なる @Query からの複数の Flow 結果を、それらの結果リストの Map の Flow に変換しようとしています。このようなもの:

 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)
      }
    
    }

しかし、明らかにそれは機能していないようです。どうすればこれを達成できるかについてのアイデア。よろしくお願いします

4

1 に答える 1

1

私は実際にはFlowAPIをあまり使用していませんが、次のようなものが機能するはずです:

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 ペア)のコレクターでの出力zip:

{A=[1], B=[2]}

アップデート

APIをもう少し使用すると、次の数をcombine取ることができます:nFlow<T>

val flowA =  flow<Int> { emit(1) }
val flowB =  flow<Int> { emit(2) }
val flowC =  flow<Int> { emit(3) }
    
combine(flowA, flowB, flowC, ::Triple)
于 2020-07-01T18:36:51.410 に答える