2012-12-08 87 views
4

任何人都可以請解釋如何檢查字符串是否爲空或空?爲什麼這兩個檢查爲空和空返回不同的結果?

我有一個下面的代碼給出不同的結果解釋爲什麼。

val someMap = ListMap[String,String]("key1" -> "") 
val s = "" 
println("s.isEmpty() : "+s.isEmpty()) 
println("someMap.get(\"key1\") : "+someMap.get("key1").toString().isEmpty) 

結果是

s.isEmpty() : true 
someMap.get("key1") : false 

但是,爲什麼?

回答

10

這是因爲Map.get返回Option:或者Some(value)如果該值在Map中或None中,如果Map中沒有這樣的鍵。

如果你把Some("")轉換成字符串,你會得到"Some()",這絕對不是空的。

達到你想要的行爲,編寫代碼爲

someMap("key1").toString.isEmpty 
+0

謝謝你的回答,知道了答案,我們可以顯示someMap.get(「KEY1」)的結果。獲得 – Azhar

+1

@Azhar好了,你可以用'獲得(「密鑰」)。GET' ,但它有點古怪:你不寫'1.toString.toInt',對吧?這是完全一樣的。 –

+0

好吧,明白了謝謝你:) – Azhar

2

我承擔

val someMap = ListMap[String,String]("key1" -> "") 

是一個錯字,你實際上意味着:

val someMap = Map[String,String]("key1" -> "") 

原因你得到不同的結果是地圖上的get(key)返回Option。如果給定密鑰存儲在Map中,則調用map.get(key)返回Some(<value_for_given_key>)。如果給定密鑰未存儲在Map中,則調用map.get(key)返回None

在你的例子中,你用鍵「key1」存儲值「」到someMap。因此,如果您撥打someMap.get("key1"),您會收到Some("")。然後,您將調用toString,該值返回"Some()""Some()".isEmpty()由於顯而易見的原因返回false。

0

如前所述,您所呼叫的回報你的周圍包裹的字符串一個選項ListMap.get方法:

def get(key: A): Option[B] 

試試這個改進println語句看到實際的結果是:

println("someMap.get(\"key1\") : "+someMap.get("key1")) 

使用的像Intellij的免費Idea 12 CE這樣的IDE可以通過顯示方法的簽名併爲其返回值提供代碼完成建議來幫助您提前發現類似問題。

0

我使用下面的代碼檢查null和empty以避免空映射錯誤。

/** 
* isContain() will check is the key value is present in map or not and the value is null or Empty 
* @Parameters : String 
* @return : Boolean 
*/ 
def isContain(paramName : String,params : scala.collection.immutable.ListMap[String,String]) : Boolean = 
{ 
    if(!(params.contains(paramName))) 
     return false 
    !isNullOrEmpty(params(paramName)) 
} 

/** 
* isNullOrEmpty() will check is the String null or Empty 
* @Parameters : String 
* @return : Boolean 
*/ 
def isNullOrEmpty(paramVal : String): Boolean = { 
     if(paramVal == null || paramVal.isEmpty()) 
      return true 
     return false 
} 
相關問題