如何在Scala中通过预处理将列表转换为可变映射



我有一个列表(列表大小是可变的):

val ids = List(7, 8, 9)

,并希望获得以下地图:

val result= Map("foo:7:bar" -> "val1",
                "foo:8:bar" -> "val1",
                "foo:9:bar" -> "val1")

map中的所有内容都是硬编码的,除了id和值对于每个人来说都是相同的,但是map必须是可变的,我想稍后更新它的一个值:

result("foo:8:bar") = "val2"
val result= Map("foo:7:bar" -> "val1",
                "foo:8:bar" -> "val2",
                "foo:9:bar" -> "val1")

您可以这样做:首先映射列表以生成元组列表,然后在结果上调用toMap,这将从元组中生成不可变的Map:

val m = ids.map(id => ("foo:" + id + ":bar", "val1")).toMap

然后将不可变的Map转换为可变的Map,例如如下所示:

val mm = collection.mutable.Map(m.toSeq: _*)

edit -中间不可变的Map不是必需的,正如评论者注意到的那样,您也可以这样做:

val mm = collection.mutable.Map(ids.map(id => ("foo:" + id + ":bar", "val1")): _*)

试试这个:

import scala.collection.mutable
val ids = List(7, 8, 9)
val m = mutable.Map[String, String]()
ids.foreach { id => m.update(s"foo:$id:bar", "val1") }
scala> m
Map(foo:9:bar -> val1, foo:7:bar -> val1, foo:8:bar -> val1)

您不需要像map那样创建任何中间对象

为什么不用foldLeft呢?

ids.foldLeft(mutable.Map.empty[String, String]) { (m, i) => 
  m += (s"foo:$i:bar" -> "val1")
}

尝试如下:

scala> import scala.collection.mutable
scala> val result = mutable.Map[String, String]()
result: scala.collection.mutable.Map[String,String] = Map()
scala> val ids = List(7, 8, 9)
ids: List[Int] = List(7, 8, 9)
scala> for(x <- ids){
     | result("foo:%d:bar".format(x)) = "val1"
     | }
scala> result
res3: scala.collection.mutable.Map[String,String] = Map(foo:9:bar -> val1, foo:7:bar -> val1, foo:8:bar -> val1)

最新更新