【问题标题】:How to open an Option[Map(A,B)] in Scala?如何在 Scala 中打开 Option[Map(A,B)]?
【发布时间】:2017-03-22 16:19:42
【问题描述】:

我已经完成了足够多的 Scala 来了解丑陋的代码是什么样的。观察:

 val sm Option[Map[String,String]] = Some(Map("Foo" -> "won", "Bar" -> "too", "Baz" -> "tree"))

预期输出:

 : String = Foo=won,Bar=too,Baz=tree

这是我的 Tyler Perry 代码,由 M. Knight Shama Llama Yama 执导:

 val result = (
     for { 
         m <- sm.toSeq; 
         (k,v) <- m
     } yield s"$k=$v"
 ).mkString(",")

但是,当 sm 为 None 时,这不起作用:-(。我收到一条错误消息,说 Nothing 没有“过滤器”方法(它认为我们正在在线过滤 (k,v) &lt;- m)Gracias!

【问题讨论】:

  • 当 sm 为 None 时的实际错误:error: value filter is not a member of Nothing
  • Tyler Perry code directed by M. Knight Shama Llama Yama 是什么?如果那是为了搞笑......它不是。

标签: scala dictionary for-comprehension flatmap scala-option


【解决方案1】:

接受选项是可迭代的事实

(for {
   map <- sm.iterator
   (k, v) <- map.iterator
  } yield s"$k=$v").mkString(",")

res1: String = "Foo=won,Bar=too,Baz=tree"

无抗性

scala> val sm: Option[Map[String, String]] = None
sm: Option[Map[String, String]] = None

scala> (for {
   map <- sm.iterator
   (k, v) <- map.iterator
  } yield s"$k=$v").mkString(",")
res44: String = ""

【讨论】:

  • 很好的答案,但我认为最好避免使用“地图”作为名称,因为它可能会导致混淆。
【解决方案2】:
scala> val sm: Option[Map[String,String]] = Some(Map("Foo" -> "won", "Bar" -> "too", "Baz" -> "tree"))
sm: Option[Map[String,String]] = Some(Map(Foo -> won, Bar -> too, Baz -> tree))

scala> val yourString = sm.getOrElse(Map[String, String]()).toList.map({
  case (key, value) => s"$key=$value"
}).mkString(", ")

【讨论】:

  • 这是我尝试理解之前的现有代码。讨厌它!太丑了!
猜你喜欢
  • 2020-07-16
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多