【问题标题】:How to use getOrElse with Map and compare value in scala如何将getOrElse与Map一起使用并比较scala中的值
【发布时间】:2016-09-03 17:07:36
【问题描述】:

我已将 JSON 解析为 Map[String , Any]。在 JSON 中我有一个 hasHeader 可选字段。

{
hasHeader : "Y"  (optional member)

}

我要检查

If(jsonMap.get("hasHeader") <=> "Y")
  doSome()
else
  Nothing

由于 hadHeader 是可选的,因此使用 getOrElse 是安全的,但我如何使用 getOrElse 并将值与 scala 中的“Y”进行比较。

我能想到的一种方法是:

 if(!jsonMap.get("hasHeader").isEmpty) {
          val hasHeaderVal = jsonMap.get("hasHeader")

         if( hasHeaderVal.equals("Y")){
               doSomething()
           }
      } 

有没有更好的方法?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您正在寻找以下内容:

    jsonMap.get("hasHeader").map(_ == "Y").getOrElse(false)
    

    .map 适用于 Options 的方式是,它仅在值为 Some 时应用给定函数(否则 None 只是通过)。然后,.getOrElse 获取值,如果调用它的 OptionSome,否则返回其第一个参数(某种默认备份)。

    【讨论】:

    • 对我来说,如果在 Some 上调用它的选项,我会返回 true,而不是地图中的值。有没有办法重构它以从地图中返回值,例如在这种情况下是“Y”?
    • @DarceyBM 不就是直接jsonMap.get("hasHeader") 吗?如果值不在地图中,您希望函数返回什么?
    【解决方案2】:

    您可以在选项上使用模式匹配来实现比较操作。

    这里我假设您的doSomething 的返回类型为Unit

     jsonMap.get("hasHeader") match {
       case Some("Y") => doSomething()
       case _ => 
     }
    

    如果您的 doSomething 返回某些内容(假设是 Int),那么,

    def doSomething(): Int = 5
    
    // you can get option of your requirement like this
    
    val intOption = jsonMap.get("hasHeader") match {
      case Some("Y") => Option(doSomething())
      case _ => None
    }
    
    // or
    val intOption = jsonMap.get("hasHeader")
      .filter(_.equals("Y"))
      .map(s => doSomething())
    
    // or if you do not want an option and have a fallback value 10
    val int = jsonMap.get("hasHeader")
      .filter(_.equals("Y"))
      .map(s => doSomething())
      .getOrElse(10)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2016-07-03
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      相关资源
      最近更新 更多