【问题标题】:How to match option map values at once?如何一次匹配选项映射值?
【发布时间】:2012-09-06 13:59:42
【问题描述】:

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

下面的sn-p是现在的样子:

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     
}

【问题讨论】:

    标签: scala scala-option


    【解决方案1】:

    当然!就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(_))
    

    【讨论】:

      【解决方案2】:
      (for (params <- myOption; value <- params.get(key)) yield Ok(value)).getOrElse(BadRequest)
      

      【讨论】:

        【解决方案3】:

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

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

        collect 采用偏函数,getOrElse 处理偏函数返回 None 的情况,这会将其转换为您的 BadRequest 情况。

        【讨论】:

        • 投反对票的人:想解释一下为什么我的答案不正确或具有误导性,以便我可以修复它?
        • 它冗长且单一,并且执行两次地图查找。
        • @TravisBrown - "Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect." (即不是“我觉得它在美学上不令人愉悦”或“效率不高”)解释这一点的评论答案是非惯用的,并且是否进行两次地图查找而不是一次会比无法解释的否决投票更有帮助。
        • @DaoWen:我认为保留解释“危险”和“不正确”的权利对我来说是公平的,但我认为这是合理的。在这种情况下,有两个优雅的、惯用的解决方案(我的和 Rex 的)对于任何有经验的 Scala 程序员来说都是透明的。从技术上讲,这个是可行的,但它需要其他任何偶然发现它的人进行大量额外的解析。
        • @TravisBrown - 你是对的。我同意将 unidiomatic 解释为 incorrect 是合理的——这是公平的。但是,发帖人不需要要求澄清对一个有效的、非草率发布的答案是否投反对票。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        相关资源
        最近更新 更多