为什么这两个检查null和empty会返回不同的结果?

时间:2012-12-08 12:35:46

标签: scala scala-collections

请问有谁可以解释我如何检查String是空还是空?

我有一个下面的代码,它给出了不同的结果解释原因。

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

但为什么?

4 个答案:

答案 0 :(得分:10)

这是因为Map.get会返回Option:如果值在地图中,则为Some(value),如果地图中没有此类密钥,则为None

如果您将Some("")变为字符串,您将获得"Some()",这绝对不是空的。

要实现您想要的行为,请将代码编写为

someMap("key1").toString.isEmpty

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

答案 2 :(得分:0)

如上所述,您正在调用的ListMap.get方法返回一个围绕String的选项:

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

尝试使用此改进的println语句来查看实际结果:

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

使用像Intellij这样免费的Idea 12 CE这样的IDE可以通过显示方法的签名并为其返回值提供代码完成建议来帮助您提前发现这样的问题。

答案 3 :(得分:0)

我正在检查null并使用下面的代码清空,以避免出现空映射错误。

/**
 * 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
}