2017-05-30 39 views
0

后映射我有一个方法如下:动态添加元素的模式匹配

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中实现这一目标?

+0

更新查询斯蒂芬工作btw) 我如何使这种情况下不敏感,即我需要处理“约克”和“约克”。 有什么想法? – b1399877

回答

1

你可以把它放在行

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 
    } 

我敢肯定有很多其他的方式来做到这一点。不知道你真的以后。

+0

有了这个解决方案,我得到如下错误:“无法解析符号参数” – b1399877

+0

对不起。我修正了这个问题。它需要额外的家长。也不清楚最新的选项和什么不是, – Stephen

+0

谢谢斯蒂芬。它的工作:) – b1399877

1

斯蒂芬斯只是用正确的值创建地图的方法可能是最好的。如果你有一个通用地图,看起来像是String [String]的字符串,并且如果值包含York,则要替换城市键,那么这也可以工作。

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

为此,我收到如下错误: '=>'预期但发现字符串文字。 – b1399877

+0

啊是的,修好了 –

0

小幅盘整布鲁斯回答

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

不会导致一个地图,而是一个可迭代

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

将是对所提供的这个(解决方案更好