我有Some()类型Map [String,String],例如
Array[Option[Any]] = Array(Some(Map(String, String)
我想将其作为
返回Array(Map(String, String))
我尝试了几种不同的提取方法 - 让我们说如果
val x = Array(Some(Map(String, String)
val x1 = for (i <- 0 until x.length) yield { x.apply(i) }
但是这会返回IndexedSeq(Some(Map)),这不是我想要的。
我尝试过模式匹配,
x.foreach { i =>
i match {
case Some(value) => value
case _ => println("nothing") }}
我试过的另一件事有点成功了
x.apply(0).get.asInstanceOf[Map[String, String]]
会做我想要的事情,但它只获得整个数组的第0个索引,我想要数组中的所有地图。 如何从某些提取地图类型?
答案 0 :(得分:1)
如果您想要Array[Any]
中的Array[Option[Any]]
,可以将其用于表达:
for {
opt <- x
value <- opt
} yield value
这会将所有非空Option
的值放入新数组中。
相当于:
x.flatMap(_.toArray[Any])
此处,所有选项都将转换为0或1元素的数组。然后将所有这些数组展平回一个包含所有值的数组。
答案 1 :(得分:0)
通常,模式要么使用Option[T]
上的转换,例如map
,flatMap
,filter
等等。
问题是,我们需要添加一个类型转换来从Map[String, String]
检索基础Any
。因此,我们将使用flatten
删除任何可能的None
类型并解包Option
和asInstanceOf
以检索该类型:
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))
答案 2 :(得分:0)
另外,当您只谈论单个值时,您可以尝试Some("test").head
并简单地将Some(null).flatten
设为null