【问题标题】:Scala - How to safely operate on a map elementScala - 如何安全地操作地图元素
【发布时间】:2018-03-21 06:17:40
【问题描述】:

我想从可变映射中获取一个元素并对其进行操作。
例如我想更改他的名字值(地图上的元素将使用新值)
最后我想退货

一开始我写了一个工作代码,但它非常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 概念。

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    简单地说:

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

    【讨论】:

      【解决方案2】:

      您的代码中有几个错误。

      案例:Some(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))
      

      【讨论】:

      • 谢谢,这破坏了“AppKey 类型表达式”的编译不符合预期的 Null 类型
      • 我的错,我没有注意到那一点也是错误的。我认为您希望整个表达式返回AppKey 类型的Option,对吗?如果是这样,我会改变我的答案,让它更简单,使用map
      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      相关资源
      最近更新 更多