2012-01-30 12 views

risposta

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) 

o

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

Ma il risultato è un 'immutable.Map', non un' immutable.HashMap' allora! La funzione ha lo scopo di restituire 'immutable.HashMap'. – Ivan

+0

È possibile specificare qualunque tipo si desideri. Se vuoi che il tipo di essere 'Map', fare' Mappa() ++ M' – dhg

+0

voglio 'immutable.HashMap', ma' immutable.HashMap ++ M' (dove 'M' è un' mutable.HashMap' restituisce 'immutable.Map'. – Ivan

12

Discussione di tornare immutable.Map vs immutable.HashMap nonostante, che dire semplicemente utilizzando il metodo 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) 

Come di 2,9, questo metodo utilizza il toMap in TraversableOnce , che è implementato come segue:

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

Grazie per aver introdotto "Map.newBuilder". Di solito ho usato mappe mutevoli solo per la costruzione di quelle immutabili. – akauppi

+0

C'è qualche differenza tangibile? Mi sono sempre chiesto se 'newBuilder' conserva una sola copia dei dati in memoria o esegue una copia completa dei dati su' .result', richiedendo quindi il doppio della quantità di memoria? – matanster

+1

È possibile controllare il [fonte] (https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/mutable/MapBuilder.scala): 'MapBuilder.result' restituisce solo' elems', quindi non crea una nuova copia. Da questo ho capito che questo è esattamente lo stesso che fare un'operazione '+' nella raccolta * immutable *, e non è coinvolta alcuna raccolta * * mutable *. – ebruchez

1

Se si dispone di una mappa: logMap: Map[String, String] solo bisogno di fare: logMap.toMap()

Problemi correlati