我已经将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()
}
}
有没有更好的方法呢?
答案 0 :(得分:3)
您正在寻找以下内容:
jsonMap.get("hasHeader").map(_ == "Y").getOrElse(false)
.map
适用于Option
的方式是,如果值为Some
,则它仅应用给定的函数(否则None
只是通过)。然后,.getOrElse
获取值,如果调用它的Option
是Some
,否则返回其第一个参数(一种默认备份)。
答案 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)