如何一次匹配选项图值?

时间:2012-09-06 13:59:43

标签: scala scala-option

是否可以同时匹配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     
}

3 个答案:

答案 0 :(得分:9)

当然!只需flatMap that sh*t

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(_))

答案 1 :(得分:3)

(for (params <- myOption; value <- params.get(key)) yield Ok(value)).getOrElse(BadRequest)

答案 2 :(得分:1)

您应该可以使用几个高阶函数来完成此操作。我认为这样做你想要的:

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

collect采用部分函数,​​getOrElse处理部分函数返回None的情况,该函数将其转换为BadRequest个案。