¿Cómo iterar sobre hashmap en Kotlin?

Respuestas:

205

No es tan dificil:

for ((key, value) in map) {
    println("$key = $value")
}

O
( actualizado de acuerdo con la información de @ RuckusT-Boom y @ KenZira ).

 map.forEach { (key, value) -> println("$key = $value") }
Alejandro Romanov
fuente
38
Vale la pena señalar que la segunda versión puede causar problemas en Android, por lo que es posible que desee utilizarmap.forEach { (key, value) -> println("$key = $value") }
Ruckus T-Boom
1
@ RuckusT-Boom ¿de qué manera causa problemas?
Anigif
7
Android no tiene (o no tenía en el momento de ese comentario) soporte completo para Java 8, y el segundo ejemplo es una llamada a Java 8. La llamada equivalente que usa la desestructuración de Kotlin es muy similar, pero necesita corchetes alrededor de los argumentos { (key, value) -> ... }. Ken Zira tiene más información en su respuesta.
Ruckus T-Boom
1
Descubrimos por las malas que la forma de @ RuckusT-Boom es mejor en Android :) (Debido a una ClassNotFoundException, nos cuesta mucho entender)
Micha
1
La respuesta de @ RuckusT-Boom es la correcta, tuvimos este problema durante las pruebas de lanzamiento en diferentes niveles de API, y no estaba muy claro por qué fallaba, el mensaje de error también es engañoso
Alaa Eddine Cherbib
64

Para la respuesta anterior, ¡tenga cuidado con la Androidsiguiente N!

map.forEach { key, value -> println("$key = $value") }

referencia a Java 8api que conduce a:

Rejecting re-init on previously-failed class java.lang.Class<T>

map.forEach { (key, value) -> println("$key = $value") }

es Kotlincaracterística

Ken Zira
fuente
Sí, también desperdicié medio día en esto. for ((key, val) ...) resolvió el problema.
andude
2

Otra forma que no se ha mencionado es:

val mapOfItems = hashMapOf(1 to "x", 2 to "y", -1 to "zz")
mapOfItems.map { (key, value) -> println("$key = $value") }
Gato blanco
fuente