如何在Kotlin中使用compute函数修改MutableMap的所有值(不改变键)
Kotlin中原地修改MutableMap所有值(不创建副本)
如果你想在不修改键、不创建原映射副本的前提下,重新计算MutableMap中所有条目的值,以下是几种可行的实现方式:
使用compute函数(对应你提供的Java实现)
Kotlin的MutableMap继承了Java的Map接口,因此可以直接使用compute函数。对应你给出的Java代码,Kotlin实现如下:
val mutableMap = mutableMapOf("key1" to "value1", "key2" to "value2") // 遍历所有键,用compute原地更新值 mutableMap.keys.forEach { key -> mutableMap.compute(key) { k, v -> "$k__$v" } }
compute函数的逻辑是:接收目标键和一个转换函数,转换函数的参数为当前键k和对应的值v,返回的新值会直接替换原映射中该键对应的值,全程不会创建新的映射副本。
更简洁的Kotlin风格实现
除了compute,你还可以用更贴合Kotlin语法的方式原地修改值,代码更直观:
方式1:遍历条目并直接更新值
mutableMap.entries.forEach { entry -> entry.setValue("${entry.key}__${entry.value}") }
方式2:直接遍历键值对并赋值
mutableMap.forEach { key, value -> mutableMap[key] = "$key__$value" }
这两种方式同样是原地修改原映射,不会产生副本,在单线程场景下使用起来比compute更简洁。如果是多线程环境,compute的原子性更新特性会更有优势。
注意:
mapValues函数会返回一个新的只读映射,原映射不会被修改,这也是你不想使用它的原因,以上所有方式都避免了这个问题。
内容的提问来源于stack exchange,提问作者ha9u63a7
相关产品推荐
相关产品推荐

