在kotlin中转换地图的惯用法?

U A*_*los 33 hashmap kotlin

在Scala中,它只是map功能.例如,如果hashMap是字符串的hashMap,那么您可以执行以下操作:

val result : HashMap[String,String] = hashMap.map(case(k,v) => (k -> v.toUpperCase))
Run Code Online (Sandbox Code Playgroud)

但是,在Kotlin中,map将地图转换为列表.在Kotlin有同样的方式做同样的事情吗?

Jam*_*ett 54

我不认为一个人的意见是惯用的,但我可能会使用

// 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() }
Run Code Online (Sandbox Code Playgroud)

  • 这也是我要做的,尽管如果仅转换值,则可以使用`mapValues`代替(例如`hashMap.mapValues {it.value.toUpperCase()}`),但我个人不喜欢`签名mapValues`因为它使用`transform:(Map.Entry <K,V>)-> R`而不是`transform:(V)-> R`在我看来这与`filterValues(predicate:(V) ->布尔型)`意味着您不能编写`hashMap.mapValues(String :: toUpperCase)`,所以我只使用`hashMap.entries.associate {...}`。 (2认同)

emu*_*emu 13

toMap功能似乎是为此而设计的:

hashMap.map { (key, value) ->
      key.toLowerCase() to value.toUpperCase()
    }.toMap()
Run Code Online (Sandbox Code Playgroud)

它转换Iterable<Pair<K, V>>Map<K, V>

  • 这是一个不必要的转换 `toMap` 为了获得更好的性能和更少的代码,使用上面@James Bassett 答案中的方法 (2认同)

Ruc*_*oom 5

您可以使用其他人建议的stdlibmapValues函数

hashMap.mapValues { it.value.uppercase() }
Run Code Online (Sandbox Code Playgroud)

或解构

hashMap.mapValues { (_, value) -> value.uppercase() }
Run Code Online (Sandbox Code Playgroud)

我相信这是最惯用的方式。