假设我使用匹配表达式来测试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。
答案 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()