如何将getOrElse与Map一起使用并比较scala中的值

时间:2016-09-03 04:21:13

标签: scala

我已经将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()
           }
      } 

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

您正在寻找以下内容:

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

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

答案 1 :(得分: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)