我有以下代码正在运行:
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
答案 0 :(得分:2)
首先,toMap
上的mutable.HashMap
方法会返回immutable.Map
。如果您确实需要矢量,也可以使用map
而不是内部foldLeft
和toVector
,这可能是不必要的。最后,您只需使用+
向地图添加所需的“步骤”键值对。
所以你的整个方法体可能是:
globalBindings.toMap + ("steps" -> steps.map(_.bindings).toVector)
我还要注意,您应该担心在Scala中使用类似Map[String, Any]
的类型。 Scala的大部分功能来自它的类型系统,它可以在很多这样的情况下发挥很大的作用,所以这些类型通常被认为是单一的。当然,在某种情况下,这种方法最有意义,如果没有更多的背景,很难确定这是否属实。