Tengo dos mapas y quiero fusionarlos usando algunas reglas.
val a = mapOf(1 to 101, 2 to 102, 3 to 103) val b = mapOf(101 to "a", 102 to "b", 103 to "c")¿Hay alguna manera de fusionar usando valores para a y clave para b?
val result = mapOf(1 to "A", 2 to "b", 3 to "c")Como está seguro de que cada valor del mapa a está presente en el mapa b , esto debería ser tan simple como usar mapValues y usar el valor de esa clave en el mapa b
a.mapValues { entry -> b[entry.value] }Debido a que tuve que editar y rehacer mi respuesta, @Sweeper se me adelantó y brindó una respuesta más detallada.
Dado que los valores de a y las claves de b siempre coincidirán, puede hacerlo con un solo mapValues , con el !! estar seguro:
val result = a.mapValues { (_, v) -> b[v]!! } Si odias la apariencia de !! , puedes reemplazar eso con
?: error("some appropriate error message") Ya que se supone que b siempre tendrá como clave los valores de a .
En general, si b no puede tener todos los valores de a como claves, puede hacer:
val result = a.entries.mapNotNull { (k, v) -> b[v]?.let { k to it } }.toMap() Esto elimina la clave del resultado, si el valor correspondiente de la clave en a no existe como clave en b . ¡También puedes usar esto como una alternativa si no te gusta el !! en la primera solución.
mapNotNull y toMap recorren las entradas una vez cada una. Si eso es un problema para usted, use asSequence :
a.asSequence().mapNotNull { (k, v) -> b[v]?.let { k to it } }.toMap()