Scala 模式匹配后动态添加元素到映射

Scala 模式匹配后动态添加元素到映射,scala,maps,pattern-matching,Scala,Maps,Pattern Matching,我有一个方法如下: protected def extract(implicit params:Params) = Map( "address" -> params.address, "city" -> params.address, "region" -> params.region, )collect { case (k, v) if v.isDefined => k -> v.get } 我想替换城市的价值,以便: "ci

我有一个方法如下:

  protected def extract(implicit params:Params) =
    Map(
  "address" -> params.address,
  "city" -> params.address,
  "region" -> params.region,
)collect {
    case (k, v) if v.isDefined => k -> v.get
  }
我想替换城市的价值,以便:

"city" -> if(params.city.contains("York")) "NewYork" else params.city, 

如何在scala中实现这一点?

您可以把它放在同一条线上

def extract(implicit params:Params) = 
    Map(
  "address" -> params.address,
  "city" -> (if(params.city.contains("York")) Some("NewYork") else params.city),
  "region" -> params.region
) collect {
    case (k, v) if v.isDefined => k -> v.get
  }

我相信还有很多其他的方法可以做到这一点。不知道你真正想要的是什么。

你可以把它放在一边

def extract(implicit params:Params) = 
    Map(
  "address" -> params.address,
  "city" -> (if(params.city.contains("York")) Some("NewYork") else params.city),
  "region" -> params.region
) collect {
    case (k, v) if v.isDefined => k -> v.get
  }

我相信还有很多其他的方法可以做到这一点。不确定你真正想要的是什么。

斯蒂芬斯用正确的值创建地图的方法可能是最好的。如果您有一个从字符串到选项[String]的通用映射,并且如果该值包含York,则希望替换city键,那么这也会起作用

 myMap.collect {
    case ("city", Some(city)) if(city.contains("York")) => "NewYork"
    case (k, v) if v.isDefined => k -> v.get
  }

斯蒂芬斯用正确的值创建地图的方法可能是最好的。如果您有一个从字符串到选项[String]的通用映射,并且如果该值包含York,则希望替换city键,那么这也会起作用

 myMap.collect {
    case ("city", Some(city)) if(city.contains("York")) => "NewYork"
    case (k, v) if v.isDefined => k -> v.get
  }

对Bruce答案的小更正

myMap.collect {
   case ("city", Some(city)) if(city.contains("York")) => "NewYork"
   case (k, v) if v.isDefined => k -> v.get
}
不会生成地图,但会生成一个Iterable

myMap.collect {
   case ("city", Some(city)) if(city.contains("York")) => "city" -> "NewYork"
   case (k, Some(v)) => k -> v
}

最好对Bruce的答案稍加修改

myMap.collect {
   case ("city", Some(city)) if(city.contains("York")) => "NewYork"
   case (k, v) if v.isDefined => k -> v.get
}
不会生成地图,但会生成一个Iterable

myMap.collect {
   case ("city", Some(city)) if(city.contains("York")) => "city" -> "NewYork"
   case (k, Some(v)) => k -> v
}

使用此解决方案会更好

,我会收到类似“无法解析符号参数”的错误,非常抱歉。我已经修好了。它需要额外的亲子关系。同样,它也不清楚什么是一种选择,什么不是,这个解决方案对我有效,但现在我有另一个问题。我需要将if循环中的条件设置为不区分大小写,即它应该接受“York”、“York”、“York”等。有什么想法吗?使用此解决方案,我会得到类似“无法解析符号参数”这样的错误,非常抱歉。我已经修好了。它需要额外的亲子关系。同样,它也不清楚什么是一种选择,什么不是,这个解决方案对我有效,但现在我有另一个问题。我需要将if循环中的条件设置为不区分大小写,即它应该接受“York”、“York”、“York”等。有什么想法吗?对于这一点,我得到的错误是:'=>'预期,但找到了字符串文字。啊,是的,修复了它。对于这一点,我得到的错误是:'=>'预期,但找到了字符串文字。啊,是的,修复了它更新了查询(Stephen worked btw提供的解决方案)如何使此不区分大小写,即我需要同时处理“York”和“York”。有什么想法吗?对此的更新查询(Stephen worked btw提供的解决方案)如何使此不区分大小写,即我需要同时处理“York”和“York”。有什么想法吗?