Scala - 如何安全地操作地图元素

时间:2018-03-20 18:49:22

标签: scala scala-collections

我想从可变地图中获取一个元素并对其进行操作 例如,我想更改他的名称值(地图上的元素将使用新值)
我想最后还给它

开始我写了一个工作代码,但它非常Java

var newAppKey: AppKey = null

val appKey = myMap(request.appKeyId)
if (appKey != null) {
  newAppKey = appKey.copy(name = request.appKeyName)
  myMap.put(appKey.name, newAppKey)
  newAppKey
} else {
  newAppKey = null
}

此代码有效,但它非常java。

我虽然喜欢

val newAppKey = appIdToApp(request.appKeyId) match {
  case: Some(appKey) => appKey.copy(name = request.appKeyName)
  case: None => None{AppKey}
}

不使用新值编译或更新myMap对象。

如何将其改进为scala概念。

2 个答案:

答案 0 :(得分:1)

简单地:

val key = request.appKeyId
val newValueOpt = myMap.get(key).map(_.copy(name = request.appKeyName))
newValueOpt.foreach(myMap.update(key, _))

答案 1 :(得分:0)

您的代码中存在一些错误。

  

案例:一些(appKey)=> appKey.copy(name = request.appKeyName)

案例的这种语法不正确。它应该是

case Some(appKey) => appKey.copy(name = request.appKeyName)

此外,表达式的返回类型当前为Any(Scala等效于Object),因为您的成功案例返回类型为对象的应用程序(appKey的类型),而失败案例返回None,属于Option类型。为了使事情保持一致,您的成功案例应该返回

Some(appKey.copy(name = request.appKeyName))

虽然有更好的方法来处理选项而不是模式匹配,但更正的代码将是

val newAppKey = appIdToApp(request.appKeyId) map (appKey => 
  appKey.copy(name = request.appKeyName))