Идиоматический способ преобразования карты в котлин?

В 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>