2016-11-11 24 views
1

に私は(いくつかを持っている)が、私は「()Scalaの

Array(Map(String, String)) 

としてそれを返すようにしたい、そのような

Array[Option[Any]] = Array(Some(Map(String, String) 

として、地図[文字列、文字列]を入力しIT-が

val x = Array(Some(Map(String, String) 
val x1 = for (i <- 0 until x.length) yield { x.apply(i) } 

場合のは、言ってみましょう が、これはどのようなIワットではありませんIndexedSeq(一部(マップ))、返し抽出するいくつかの異なる方法を試しまし蟻。

私は、私はそれがやや成功した試した他の事は

x.apply(0).get.asInstanceOf[Map[String, String]] 

は私が何をしたい何かをするだろうということでしたが、それだけで全体の配列の0番目のインデックスを取得し、

x.foreach { i => 
    i match { 
    case Some(value) => value 
    case _ => println("nothing") }} 

をパターンマッチングを試してみました配列内のすべてのマップが必要になります。 いくつかのマップタイプを抽出するにはどうすればよいですか?

答えて

0

一般的に、パターンは、など、いずれかのmapのように、Option[T]に変換を使用することですflatMapfilter

問題があり、我々はAnyから基礎となるMap[String, String]を取得するために型キャストを追加する必要があります。だから我々は、タイプを盗んために潜在的にNone種類のいずれかを削除してOptionをアンラップし、asInstanceOfするflattenを使用します:

scala> val y = Array(Some(Map("1" -> "1")), Some(Map("2" -> "2")), None) 
y: Array[Option[scala.collection.immutable.Map[String,String]]] = Array(Some(Map(1 -> 1)), Some(Map(2 -> 2)), None) 

scala> y.flatten.map(_.asInstanceOf[Map[String, String]]) 
res7: Array[Map[String,String]] = Array(Map(1 -> 1), Map(2 -> 2)) 
+0

Map [String、String]で動作するAny型を取り除きたいが、getOrElseはまだArray [Any]を返すというのが問題だと思います。 – user3551523

+0

@ user3551523あなたは 'Array [Any]'、または 'Array [Option [Map [String、String]]]'で作業していますか? –

+0

私はArray [Option [Any]]で作業しています – user3551523

1

あなたArray[Option[Any]]からArray[Any]をしたい場合、あなたは表現のためにこれを使用することができます。

for { 
    opt <- x 
    value <- opt 
} yield value 

これは空でないすべての値Optionを新しい配列の中に入れます。

それはこれと等価である:ここ

x.flatMap(_.toArray[Any]) 

、すべてのオプションは、0または1要素のいずれかの配列に変換されます。これらの配列はすべて、すべての値を含む1つの配列に平坦化されます。