private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
如何將其轉換爲不可變?轉換mutable爲不可變的地圖
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
如何將其轉換爲不可變?轉換mutable爲不可變的地圖
不可變的層次結構不包含MultiMap,因此您將無法使用具有相同方便語法的轉換結構。但是如果你很樂意處理關鍵/值集對,那麼:
如果你只是想要一個可變的HashMap
,你可以在2.8中使用x.toMap
或者在2.7中使用collection.immutable.Map(x.toList: _*)
。
但是如果你希望整個結構是不可改變的 - 包括底層集合! - 那麼你必須做更多的事情:你需要沿着路徑轉換集合。在2.8:
x.map(kv => (kv._1,kv._2.toSet)).toMap
在2.7:
collection.immutable.Map(
x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)
不耐煩等待scala 2.8穩定 – Jeriho 2010-05-13 10:44:02
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"
^
當我看到「mutableMap.toMap」時,我感到很驚訝,但後來我驗證了api並沒有發現任何類似的東西。 http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html 第二個問題 - 設置[B]是可變的。這就是爲什麼轉換不那麼容易。 – Jeriho 2010-05-12 09:00:26
@Jeriho:toMap在Scala2.8中引入 – Eastsun 2010-05-12 09:07:38
Thx Eastsun。對不起傑里奧,我沒有提到它。 – 2010-05-12 09:10:51
可以使用myMap.toMap
到一個可變的地圖轉換成不可變的斯卡拉2.8及更高版本。
看着從文檔的toMap
定義:
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
}
您只需以下
val imm_map = MMMap.toMap
我猜* *您創建一個新的?只是猜測,但通常事情是這樣工作的。 – 2010-05-12 08:24:10
我不確定你的意思是 – Jeriho 2010-05-12 09:03:08
hmm ..'MMMap.toMap'? – 2014-08-21 12:46:02