Как перебирать хэш-карту в Котлине?

Ответы:

205

Это не так уж и сложно:

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

ИЛИ
( Обновлено в соответствии с информацией @ RuckusT-Boom и @ KenZira .)

 map.forEach { (key, value) -> println("$key = $value") }
Александр Романов
источник
38
Стоит отметить, что вторая версия может вызвать проблемы на Android, поэтому вы можете использоватьmap.forEach { (key, value) -> println("$key = $value") }
Ruckus T-Boom
1
@ RuckusT-Boom Каким образом это вызывает проблемы?
Anigif
7
Android не имеет (или не имел на момент написания этого комментария) полной поддержки Java 8, и второй пример - это вызов Java 8. Эквивалентный вызов с использованием деструктуризации Kotlin выглядит очень похоже, но вам нужны скобки вокруг аргументов { (key, value) -> ... }. У Кена Зира есть дополнительная информация в своем ответе.
Ruckus T-Boom
1
Мы на собственном опыте выяснили, что способ @ RuckusT-Boom лучше на Android :) (из-за ClassNotFoundException нам трудно понять)
Micha
1
Ответ @ RuckusT-Boom правильный, у нас была эта проблема во время выпускных тестов на разных уровнях API, и было не очень понятно, почему он дает сбой, сообщение об ошибке также вводит в заблуждение
Alaa Eddine Cherbib
64

Для приведенного выше ответа будьте осторожны с Androidприведенным ниже N!

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

ссылка на Java 8api, которая приводит к:

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

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

это Kotlinособенность

Кен Зира
источник
Да, я тоже потратил на это полдня. for ((key, val) ...) решил проблему.
andude
2

Другой способ, о котором не упоминалось, это:

val mapOfItems = hashMapOf(1 to "x", 2 to "y", -1 to "zz")
mapOfItems.map { (key, value) -> println("$key = $value") }
Белая кошка
источник