【问题标题】:How to extract values from Some() in Scala如何从 Scala 中的 Some() 中提取值
【发布时间】:2023-04-01 18:46:01
【问题描述】:

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

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    如果你想从你的Array[Option[Any]] 得到一个Array[Any],你可以用这个来表达:

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

    这会将所有非空Options 的值放入一个新数组中。

    相当于这样:

    x.flatMap(_.toArray[Any])
    

    在这里,所有选项都将转换为 0 或 1 个元素的数组。然后所有这些数组将被展平为一个包含所有值的数组。

    【讨论】:

      【解决方案2】:

      一般来说,该模式要么在Option[T]上使用转换,如mapflatMapfilter等。

      问题是,我们需要添加一个类型转换来从Any 检索底层的Map[String, String]。所以我们将使用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))
      

      【讨论】:

      • 我认为问题在于我想摆脱 Any 类型来对 Map[String, String] 进行操作,但 getOrElse 仍然返回 Array[Any]。
      • @user3551523 您正在使用Array[Any]Array[Option[Map[String, String]]]
      • @user3551523 我明白了。你知道底层Array中的所有对象都一定是Map[String, String]吗?
      • 是的,它们都是 Map[String, String] 但它被封装在 Some 中。所以我现在拥有的是 Some(Map[String, String])。
      • 您的编辑版本正是我所需要的!谢谢!
      【解决方案3】:

      此外,当您谈论单个值时,您可以尝试 Some("test").head 和 null 只需 Some(null).flatten

      【讨论】:

      • Some("test").head 返回类型 StringSome(null).flatten 返回类型 Option[Nothing]。我看不出它们有什么关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      相关资源
      最近更新 更多