scala匹配表达式避免代码重复

时间:2013-11-26 20:23:11

标签: scala

假设我使用匹配表达式来测试Map对象中可能存在或不存在的值,如下所示:

map.get(key) match {
  case Some(value) if (cond1(value)) => res1(value)
  case Some(value) if (cond2(value)) => res2()
  case None => res2()
  case _ => // None of the above
}

正如你所看到的,我希望在任何一种情况下调用res2,在这种情况下,我有一个键值,它符合条件2,或者我没有键的值。任何人都可以建议一个更好的构造,以避免上面的示例中对res2()的重复调用吗?

由于 Des

* 很抱歉,我意识到代码示例不太正确并且已相应更新。我只想在密钥值满足cond2或密钥没有条目的情况下调用res2。

2 个答案:

答案 0 :(得分:1)

我相信你想要的是:

map.get(key) match {
  case Some(value) if (cond1(value)) => res1(value)
  case o: Option[String] if ( o.forall(cond2) ) => res2()
  case _ => 
}

将[String]替换为key的任何类型。

Option上的方法名称并不总是最明显的;在维持功能纯度方面,他们为我们的文盲牺牲了清晰度。在这种情况下,scaladoc for Option告诉我们forall:

  

如果此选项为空或谓词p返回true,则返回true   当应用于此scala.Option的值时。

答案 1 :(得分:0)

如果只有这种可能性,那么没有gard:

case Some(value) => if (cond1(value) ) res1(value) else res2()