4

文字列がnullまたは空かどうかを確認する方法を誰かに説明してもらえますか?

私は以下のコードを持っていますが、それは異なる結果を与えており、その理由を説明しています。

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にある場合、またはMapにそのようなキーがない場合に、 OptionMap.getを返すためです。Some(value)None

文字列に目を向けると、間違いなく空ではない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。指定されたキーがに格納されている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を返します。

于 2012-12-08T12:52:57.957 に答える
0

前述のように、呼び出しているListMap.getメソッドは、文字列にラップされたOptionを返します。

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

この改善されたprintlnステートメントを試して、実際の結果を確認してください。

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

Intellijの無料のIdea12CEのようなIDEを使用すると、メソッドのシグネチャを表示し、その戻り値のコード補完の提案を提供することで、このような問題を事前に見つけることができます。

于 2012-12-08T18:52:57.533 に答える
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
}
于 2012-12-09T08:55:55.360 に答える