我有一个列表(列表大小是可变的):
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)