5

是否可以Option[Map[String,String]]一次匹配某个键(例如没有嵌套匹配)?

以下片段是现在的样子:

val myOption:Option[Map[String,String]] = ...
myOption match {
  case Some(params) =>
    params get(key) match {
      case Some(value) => Ok(value)
      case None => BadRequest
  case None => BadRequest     
}
4

3 回答 3

9

当然!就是flatMap那个狗屎

def lookup(o: Option[Map[String, String]], k: String) =
  o.flatMap(_ get k).map(Ok(_)).getOrElse(BadRequest)

如果您使用的是 Scala 2.10,则可以折叠Option

def lookup(o: Option[Map[String, String]], k: String) =
  o.flatMap(_ get k).fold(BadRequest)(Ok(_))
于 2012-09-06T14:04:34.877 回答
3
(for (params <- myOption; value <- params.get(key)) yield Ok(value)).getOrElse(BadRequest)
于 2012-09-06T14:06:50.713 回答
1

您应该能够使用几个高阶函数来做到这一点。我认为这可以满足您的要求:

myOption.collect {
  case m if (m contains key) => Ok(m(key))
} getOrElse BadRequest

collect接受偏函数,并getOrElse处理偏函数返回的情况,将None其转换为您的BadRequest情况。

于 2012-09-06T14:14:11.117 回答