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”。有什么想法吗?