2012-01-30 10 views

Odpowiedz

8
scala> val m = collection.mutable.HashMap(1->2,3->4) 
m: scala.collection.mutable.HashMap[Int,Int] = Map(3 -> 4, 1 -> 2) 

scala> collection.immutable.HashMap() ++ m 
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4) 

lub

scala> collection.immutable.HashMap(m.toSeq:_*) 
res2: scala.collection.immutable.HashMap[Int,Int] = Map(1 -> 2, 3 -> 4) 
+0

Ale wynik jest 'immutable.Map', a nie' immutable.HashMap' wtedy! Funkcja ma na celu zwrócenie 'immutable.HashMap'. – Ivan

+0

Możesz określić, jaki typ chcesz. Jeśli chcesz, aby typ był 'Mapą', wykonaj' Map() ++ m' – dhg

+0

Chcę 'immutable.HashMap', ale' immutable.HashMap ++ m' (gdzie 'm' jest' mutable.HashMap') zwraca 'immutable.Map'. – Ivan

12

Dyskusja o powrocie immutable.Map Vs. immutable.HashMap Niezależnie od tego, co po prostu stosując metodę toMap:

scala> val m = collection.mutable.HashMap(1 -> 2, 3 -> 4) 
m: scala.collection.mutable.HashMap[Int,Int] = Map(3 -> 4, 1 -> 2) 

scala> m.toMap 
res22: scala.collection.immutable.Map[Int,Int] = Map(3 -> 4, 1 -> 2) 

Począwszy od 2,9, to wykorzystuje metodę toMap w TraversableOnce , który jest realizowany w następujący sposób:

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 
} 
+0

Dzięki za wprowadzenie "Map.newBuilder". Zwykle używałem map zmiennych do konstrukcji niezmiennych. – akauppi

+0

Czy są jakieś namacalne różnice? Zawsze zastanawiałem się, czy 'newBuilder' zachowuje tylko jedną kopię danych w pamięci czy wykonuje pełną kopię danych na' .result', co wymaga dwukrotnej ilości pamięci? – matanster

+1

Możesz sprawdzić [źródło] (https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/mutable/MapBuilder.scala): 'MapBuilder.result' po prostu zwraca' elems', więc nie tworzy nowej kopii. Z tego wynika, że ​​jest to dokładnie to samo, co operacja '+' w kolekcji * immutable *, i nie dotyczy * kolekcji * mutable *. – ebruchez

1

Jeśli masz mapę: logMap: Map[String, String] prostu trzeba zrobić: logMap.toMap()

Powiązane problemy