如何在Scala中将地图与不同的值类型组合在一起

时间:2015-05-21 14:42:12

标签: scala generics collections types

我有以下代码正在运行:

case class Step() {
  def bindings(): Map[String, Any] = ???
}

class Builder {
  private val globalBindings = scala.collection.mutable.HashMap.empty[String, Any]
  private val steps = scala.collection.mutable.ArrayBuffer.empty[Step]

  private def context: Map[String, Any] =
    globalBindings.foldLeft(Map[String, Any]())((l, r) => l + r) ++ Map[String, Any]("steps" -> steps.foldLeft(Vector[Map[String, Any]]())((l, r) => l.+:(r.bindings)))
}

但我认为它可以简化,以便在'context'方法中不需要第一个foldLeft。

期望的结果是生成一个映射,其中条目值是String,稍后将调用toString的对象,或返回String的函数。

这是我用Scala的类型系统做得最好还是可以让代码更清晰?

TIA

1 个答案:

答案 0 :(得分:2)

首先,toMap上的mutable.HashMap方法会返回immutable.Map。如果您确实需要矢量,也可以使用map而不是内部foldLefttoVector,这可能是不必要的。最后,您只需使用+向地图添加所需的“步骤”键值对。

所以你的整个方法体可能是:

globalBindings.toMap + ("steps" -> steps.map(_.bindings).toVector)

我还要注意,您应该担心在Scala中使用类似Map[String, Any]的类型。 Scala的大部分功能来自它的类型系统,它可以在很多这样的情况下发挥很大的作用,所以这些类型通常被认为是单一的。当然,在某种情况下,这种方法最有意义,如果没有更多的背景,很难确定这是否属实。