Идиоматический способ преобразования карты в котлин?
В Scala это просто функция map
. Например, если hashMap является hashMap строк, вы можете сделать следующее:
val result : HashMap[String,String] = hashMap.map(case(k,v) => (k -> v.toUpperCase))
В Котлин, однако, map
превращает карту в список. Есть ли идиоматический способ сделать то же самое в Котлине?
Ответы
Ответ 1
Я не думаю, что мнение одного человека считается идиоматичным, но я бы, вероятно, использовал
// transform keys only (use same values)
hashMap.mapKeys { it.key.toUpperCase() }
// transform values only (use same key) - what you're after!
hashMap.mapValues { it.value.toUpperCase() }
// transform keys + values
hashMap.entries.associate { it.key.toUpperCase() to it.value.toUpperCase() }
Ответ 2
Я нашел другой вариант. Это кажется более понятным.
val result = mapOf( *hashMap.map { it.key.toUpperCase() to it.value.toUpperCase() }.toTypedArray() )
Он автоматически выведет тип приведенной карты.
.toTypedArray()
требуется использовать оператор splat(*)
.
Ответ 3
Вы можете использовать stdlib mapValues
функцию, которую другие предложили:
hashMap.mapValues { it.value.toUpperCase() }
Я считаю, что это самый идиоматический способ.
Ответ 4
toMap
функция toMap
предназначена для этого:
hashMap.map { (key, value) ->
key.toLowerCase() to value.toUpperCase()
}.toMap()
Он преобразует Iterable<Pair<K, V>>
в Map<K, V>