2016-09-03 29 views
0

我已經解析JSON到一個地圖[字符串,任何]。在JSON我有一個hasHeader可選字段。如何使用getOrElse與地圖和比較值在斯卡拉

{ 
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() 
      } 
     } 

是否有這樣做的沒有更好的辦法?

回答

3

您正在尋找以下:

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

的方式.map作品Option s是如果該值是Some(否則None只是通過),它僅適用於特定的函數。然後,.getOrElse獲取該值,如果Option被調用的是Some,但返回其第一個參數(排序默認備份)。

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)