2012-01-30 21 views

Respuesta

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

Pero el resultado es un 'immutable.Map', no un' immutable.HashMap' entonces! La función está destinada a devolver 'inmutable.HashMap'. – Ivan

+0

Puede especificar el tipo que desee. Si quieres que el tipo sea 'Map', haz' Map() ++ m' – dhg

+0

Quiero 'inmutable.HashMap', pero' inmutable.HashMap ++ m' (donde 'm' es un' mutable.HashMap') devuelve 'inmutable.Map'. – Ivan

12

discusión acerca de regresar immutable.Map vs immutable.HashMap no obstante, ¿qué pasa con el simple uso de la toMap método:

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) 

A partir de 2,9, este utiliza el método toMap en TraversableOnce , que se implementa de la siguiente manera:

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

Gracias por introducir 'Map.newBuilder'. Normalmente usé mapas mutables solo para la construcción de mapas inmutables. – akauppi

+0

¿Hay alguna diferencia tangible? Siempre me pregunté si 'newBuilder' conserva solo una copia de los datos en la memoria o realiza una copia completa de los datos en' .result', por lo que requiere el doble de la cantidad de memoria. – matanster

+1

Puede consultar la [fuente] (https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/mutable/MapBuilder.scala): 'MapBuilder.result' simplemente devuelve' elems', por lo que no crea una nueva copia. A partir de esto, entiendo que esto es exactamente lo mismo que hacer una operación '+' en la colección * inmutable *, y no está involucrada ninguna colección * mutable *. – ebruchez

1

Si tienes un mapa: logMap: Map[String, String] sólo tiene que hacer: logMap.toMap()

Cuestiones relacionadas