2017-05-16 12 views
1

ScalaマップにはキーXが含まれています。 値は、文字列Array("Y") の配列か、単純なStringオブジェクト"Y"のいずれかです。 Iの値が配列の場合値が文字列と等しいか文字列を含む配列かを確認します

mayMap("X")=="Y" 

または、値が文字列であればマップ及び試験

から値を取得する必要があります。

myMap("X").contains("Y") 

私が最初にすべての値の最初の型をチェックするif声明文を使用する必要はありません。 1つのオプションは、値が配列であれば配列を返し、そうでなければマップに含まれる単一の文字列要素で配列を作成する関数を書くことです。それでは、コールは次のようになります。

myToArrayFunction(myMap("X")).contains("Y") 

これは私がJavaで実際に行うことです。

これはScalaです。既存の関数を使用してこれを1行で行うのがより良いイディオムですか?

+0

ので、あなたのマップの種類があるの? 'Map [String、Any]'かこれに類するもの? – mfirry

+0

はい、それは正しいです – user1052610

+2

私はむしろ 'Map [String、Either [String、Array [String]]'のようなものを使用したい – mfirry

答えて

3

これは動作するはずです:

myMap.get("X") match { 
    case None => println("oh snap!") 
    case Some(x) => x match { 
    case i: String => println(s"hooray for my String $i") // do something with your String here 
    case a: Array[String] => println(s"It's an Array $a") // do something with your Array here 
    } 
} 
+0

はい、そういうものがあります。しかし、もっと簡単な方法があるのだろうかと思った。 – user1052610

1
case class Y(name: String) 

//val a = Map[String, Any]("X" -> "Y") 
val a = Map[String, Any]("X" -> Y("Peter")) 

a.getOrElse("X", "Default") match { 
    case s: String => println(s) 
    case Y(name) => println(name) 
} 

あなたもこのようなものを使用することができます

//val a = Map[String, Any]("X" -> "Y") 
val a = Map[String, Any]("X" -> Y("Peter")) 

a.map(v => println(v._2)) 
関連する問題