muc*_*aho 3 scala idiomatic map
我需要更新(检索并增加)绑定到地图中两个键的两个不同值.这两个键有时会重合.我现在有以下代码:
// val map: Map[Int, Int]
// val key1, key2: Int
if (key1 == key2) {
tailRecFunction(someArg, map
+ Tuple2(key1, 2 + map.getOrElse(key1, 0)))
} else {
tailRecFunction(someArg, map
+ Tuple2(key1, 1 + map.getOrElse(key1, 0))
+ Tuple2(key2, 1 + map.getOrElse(key2, 0)))
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果您使用else块时key1 == key2,则值key1 == key2将会错误地增加1而不是2---第二个元组错误地更新原始值,而不是第一个元组应用的值.
是否有更清晰的方式来写这个?
首先,您可以简化地图,以便0在没有密钥时返回:
val map0 = Map.empty[Int, Int] withDefaultValue 0
Run Code Online (Sandbox Code Playgroud)
然后你可以安全地打电话map(key)而不是map.getOrElse(key, 0).
其次,您可以使用箭头关联语法来创建Tuple2实例.即key -> value代替Tuple2(key, value).
第三,我根本不会介绍if ... then ... else.只需连续更新每个密钥的映射:
def addKey(map: Map[Int, Int], key: Int) = map + (key -> (map(key) + 1))
val map1 = addKey(map0, key1)
val map2 = addKey(map1, key2)
tailRecFunction(someArg, map2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
957 次 |
| 最近记录: |