如何通过更改其值来变换地图?

时间:2018-11-29 08:41:23

标签: kotlin

我需要对地图中的所有值进行哈希处理并返回相同类型的地图。

此刻,我的解决方案看起来很奇怪:

val hashedPolicies = policyProperties.map { it.key to it.value.hash() }.toMap()

如果没有toMap(),它将返回List,这是不可接受的。

是否有更好的方法来创建像这样的地图新地图(无需使用.toMap())?

2 个答案:

答案 0 :(得分:7)

尝试mapValues

inline fun <K, V, R> Map<out K, V>.mapValues(
    transform: (Entry<K, V>) -> R
): Map<K, R>
     

返回新地图,其条目具有该地图的键以及通过将变换函数应用于此地图中的每个条目而获得的值。

     

返回的地图保留了原始地图的输入迭代顺序。
   kotlin-stdlib / kotlin.collections / mapValues

val test = mapOf("foo" to "bar")
println(test)
// {foo=bar}

val result = test.mapValues { it.value.hashCode() }
println(result)
// {foo=97299}

答案 1 :(得分:0)

使用fold一次完成所有操作:

val hashedPolicies = policyProperties.entries.fold(mutableMapOf<KeyType, Int>{ map, it ->
    map.put(it.key, it.value.hashCode())
    map
}

虽然mapValues更具体并且适合于这种特定情况,但是fold的级别较低的方法具有可用于所有iterable和数组类型的优点。此外,它还允许您使用任意返回类型。