All'interno di una mia funzione costruisco un set di risultati riempiendo una nuova HashMap mutabile con i dati (se c'è un modo migliore - apprezzerei i commenti). Quindi mi piacerebbe restituire il set di risultati come immutabile HashMap. Come derivare un immutabile da un mutabile?Come convertire una HashMap mutabile in un equivalente immutabile in Scala?
risposta
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)
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
}
Grazie per aver introdotto "Map.newBuilder". Di solito ho usato mappe mutevoli solo per la costruzione di quelle immutabili. – akauppi
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
È 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
Se si dispone di una mappa: logMap: Map[String, String]
solo bisogno di fare: logMap.toMap()
Ma il risultato è un 'immutable.Map', non un' immutable.HashMap' allora! La funzione ha lo scopo di restituire 'immutable.HashMap'. – Ivan
È possibile specificare qualunque tipo si desideri. Se vuoi che il tipo di essere 'Map', fare' Mappa() ++ M' – dhg
voglio 'immutable.HashMap', ma' immutable.HashMap ++ M' (dove 'M' è un' mutable.HashMap' restituisce 'immutable.Map'. – Ivan