如何在Scala中的匹配大小写语句中使用Map值

时间:2012-05-03 14:31:12

标签: scala

我有这样的地图:

val mealIdsMap: Map[String, String]    =
Map (
      "breakfast"     ->    "omelet",
      "lunch"         ->    "steak",
      "dinner"        ->    "salad"
)

然后我尝试在匹配语句中使用它:

"omelet" match 
{ 
  case mealIdsMap("breakfast") => "Thank God"
}

我收到了这个错误:

error: value mealIdsMap is not a case class constructor,
nor does it have an unapply/unapplySeq method
              case mealIdsMap("breakfast") => "Thank God"

任何人都知道如何在匹配/案例陈述中使用这样的地图吗?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:7)

您应该从教程中了解模式匹配的目的,可能来自this one(谷歌的第一个非常重要的例子)。

你推翻了考试:

mealIdsMap("breakfast") match {
  case "omelet" => "Thank God"
  case _ => "Don't forget a default"
}

如果您不确定密钥是否存在(即使您是,如果您想编写惯用的scala,您应该更喜欢:

mealIdsMap.get("breakfast") match {
  case Some("omelet") => "Thank God"
  case _ => "Don't forget a default"
}

get返回一个选项,避免你尝试捕捉你的代码或让它静静地破解。

答案 1 :(得分:2)

尽管如此,尝试实现这样的行为仍然很有趣。看看这个例子:

  case class InvMatcher (m:Map[String, String]){
 def unapply(v:String):Option[String] = {
   return m collectFirst {case (k, `v`) => k}
 }

}

此类可帮助您反向匹配地图。 用法:

val ma = InvMatcher (Map (
  "breakfast"     ->    "omelet",
  "lunch"         ->    "steak",
  "dinner"        ->    "salad"
));

"steak" match {
  case ma(s) => s match {
    case "breakfast" => print("Thank God")
    case "lunch" => print("whatever")

    case _ => print("dont forget default")
  }
  case _ => print("dont forget default")
}

这几乎是你想要的,虽然你需要第二个匹配语句(这里不需要默认情况......)