4

谁能解释一下如何检查 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

4 回答 4

10

这是因为Map.get返回一个OptionSome(value)如果值在 Map 中None,或者如果 Map 中没有这样的键。

如果你转向Some("")一个字符串,你会得到"Some()"绝对不是空的。

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

someMap("key1").toString.isEmpty
于 2012-12-08T12:51:48.537 回答
2

我假设

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

是一个错字,你的意思是:

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

你得到不同结果的原因是get(key)在地图上返回Option。如果给定的键存储在 a 中Map,则调用map.get(key)返回Some(<value_for_given_key>)。如果给定的键未存储在 a 中Map,则调用map.get(key)返回None

在您的示例中,您将带有键“key1”的值“”存储到someMap. 因此,如果你打电话someMap.get("key1"),你会得到Some("")。然后调用toString该值,该值返回"Some()". 并且"Some()".isEmpty()由于明显的原因返回 false。

于 2012-12-08T12:52:57.957 回答
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
}
于 2012-12-09T08:55:55.360 回答
0

如前所述,您正在调用的 ListMap.get 方法返回一个包裹在您的字符串周围的选项:

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

试试这个改进的 println 语句来查看实际结果:

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

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

于 2012-12-08T18:52:57.533 回答