Como iterar sobre hashmap em Kotlin?

93

Como iterar no HashMap no Kotlin?

typealias HashMap<K, V> = HashMap<K, V> (source)
Nomi
fonte

Respostas:

213

Não é tão difícil:

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

OU
( atualizado de acordo com as informações de @RuckusT-Boom e @ KenZira .)

 map.forEach { (key, value) -> println("$key = $value") }
Alexander Romanov
fonte
38
É importante notar que a segunda versão pode causar problemas no Android, então você pode querer usarmap.forEach { (key, value) -> println("$key = $value") }
Ruckus T-Boom
1
@ RuckusT-Boom de que forma isso causa problemas?
Anigif
7
O Android não tem (ou não tinha no momento desse comentário) suporte total para Java 8 e o segundo exemplo é uma chamada de Java 8. A chamada equivalente usando a desestruturação Kotlin é muito semelhante, mas você precisa de colchetes em torno dos argumentos { (key, value) -> ... }. Ken Zira tem mais informações em sua resposta.
Ruckus T-Boom
1
Descobrimos da maneira mais difícil que o jeito de @RuckusT-Boom é melhor no Android :) (Devido a uma ClassNotFoundException, foi difícil descobrir)
Micha
1
A resposta da @RuckusT-Boom é a correta, tivemos esse problema durante os testes de lançamento em diferentes níveis de API e não estava muito claro por que estava travando, a mensagem de erro também é enganosa
Alaa Eddine Cherbib
64

Para a resposta acima, tome cuidado com a Androidabaixo N!

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

referência a Java 8api que leva a:

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

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

é Kotlinrecurso

Ken Zira
fonte
Sim, também perdi meio dia com isso. para ((chave, val) ...) resolveu o problema.
andude
2

Outra forma que não foi mencionada é:

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