如何从Scala中的Some()中提取值

时间:2016-11-11 08:59:18

标签: scala functional-programming

我有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个索引,我想要数组中的所有地图。 如何从某些提取地图类型?

3 个答案:

答案 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]上的转换,例如mapflatMapfilter等等。

问题是,我们需要添加一个类型转换来从Map[String, String]检索基础Any。因此,我们将使用flatten删除任何可能的None类型并解包OptionasInstanceOf以检索该类型:

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