Reputation: 7309
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
How convert it to immutable?
Upvotes: 85
Views: 79445
Reputation: 1849
You can use myMap.toMap
to convert an a mutable map into immutable in Scala 2.8 and later versions.
Looking at definition of toMap
from documentation:
def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = {
val b = immutable.Map.newBuilder[T, U]
for (x <- self) b += x
b.result
}
Upvotes: 13
Reputation: 167921
The immutable hierarchy doesn't contain a MultiMap, so you won't be able to use the converted structure with the same convenient syntax. But if you're happy to deal with key/valueset pairs, then:
If you just want a mutable HashMap
, you can just use x.toMap
in 2.8 or collection.immutable.Map(x.toList: _*)
in 2.7.
But if you want the whole structure to be immutable--including the underlying set!--then you have to do more: you need to convert the sets along the way. In 2.8:
x.map(kv => (kv._1,kv._2.toSet)).toMap
In 2.7:
collection.immutable.Map(
x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)
Upvotes: 77
Reputation: 11085
scala> val mutableMap = new HashMap[Int, String]
mutableMap: scala.collection.mutable.HashMap[Int,String] = Map()
scala> mutableMap += 1 -> "a"
res5: mutableMap.type = Map((1,a))
scala> mutableMap
res6: scala.collection.mutable.HashMap[Int,String] = Map((1,a))
scala> val immutableMap = mutableMap.toMap
immutableMap: scala.collection.immutable.Map[Int,String] = Map((1,a))
scala> immutableMap += 2 -> "b"
<console>:11: error: reassignment to val
immutableMap += 2 -> "b"
^
Upvotes: 34