Estoy de pruebas unitarias de código java a partir de ScalaTest y quisiera llenar un java.util.HashMap dentro de la misma declaración se pone declarado. Es posible hacer esto en Scala?

OriginalEl autor Nermin Serifovic | 2010-10-01

5 Comentarios

  1. 25

    Hay un montón de diferentes maneras de lograr esto, sólo algunos de los cuales han aparecido en las respuestas hasta ahora.

    Método Uno: Desde java.util.HashMap tiene el constructor HashMap(Map<? extends K,? extends V> m), usted podría pasar un válido en Java Mapa. Y usted puede hacer esto trivialmente con Scala útil JavaConversions:

    scala> import scala.collection.JavaConversions._
    import scala.collection.JavaConversions._
    
    scala> val myMap = Map(1->"Hi",2->"Bye")
    myMap: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,Hi), (2,Bye))
    
    scala> val jmap = new java.util.HashMap[Int,String](myMap)  //Need explicit types
    jmap: java.util.HashMap[Int,String] = {1=Hi, 2=Bye}

    Las desventajas son que usted tiene que tener ya un Scala mapa (un poco derrochador si vas a crear un Java, tal vez), y que tendrá que especificar los tipos. Pero es compacto y sin dolor.

    Método Dos: como alternativa, puede crear un nuevo bloque de código como la instrucción de declaración, para que usted incluso no necesita tener JavaConversions disponibles:

    scala> val jmap2 = {              
         |   val x = new java.util.HashMap[Int,String]  
         |   for ((k,v) <- List(1->"Howdy",2->"partner")) x.put(k,v)
         |   x
         | }
    jmap2: java.util.HashMap[Int,String] = {1=Howdy, 2=partner}

    Ligeramente menos compacta, pero completamente general, y como eficiente (o ineficiente) como el cuidado de hacer.

    Método Tres: También, usted puede crear una subclase anónima de HashMap mientras que está bien tener una subclase (es decir, .getClass no volver java.util.HashMap), y utilizar el inicializador para establecer sus valores:

    scala> val jmap3 = new java.util.HashMap[Int,String] { 
         |   put(1,"Yo"); put(2,"bro")
         | }
    jmap3: java.util.HashMap[Int,String] = {1=Yo, 2=bro}
    
    scala> jmap3.getClass.getName
    res0: java.lang.String = $anon$1
    
    scala> jmap3.getClass.getSuperclass.getName
    res1: java.lang.String = java.util.HashMap

    La desventaja es, por supuesto, que es una subclase de HashMap en lugar de HashMap, pero es más compacto que el de asignación de código de bloque de versión, ya que no es necesario asignar el nuevo mapa a un val.

    Método de Cuatro: Y finalmente, por supuesto, usted puede crear un método que hace lo que quiere, y llamar en su lugar:

    scala> def newJHM[A,B](kv: Iterable[(A,B)]) = {
         |   val jhm = new java.util.HashMap[A,B]  
         |   kv.foreach(i => jhm.put(i._1,i._2))   
         |   jhm                                   
         | }                                       
    newJHM: [A,B](kv: Iterable[(A, B)])java.util.HashMap[A,B]
    
    scala> val jmap4 = newJHM(Seq(1->"Bye",2->"Now"))  //Type inference now works
    jmap4: java.util.HashMap[Int,java.lang.String] = {1=Bye, 2=Now}

    Esto es apenas menos compacto que el de otros y obtiene los tipos correctos sin tener que especificar, por lo que puede ser una buena elección si estás haciendo esto más de una vez.

    P. S. Sólo por diversión, me ha mostrado una variedad de maneras de conseguir algo de pares clave-valor en el mapa, pero no son específicos para un determinado método (excepto para el #1, que requiere de un mapa). Mezclar y combinar a su gusto.

    Esta es una gran respuesta.

    OriginalEl autor Rex Kerr

  2. 8

    Usted podría hacer el mapa como una clase anónima, y realizar la inicialización como parte de la inicialización de instancia del objeto.

    import java.util.HashMap
    val jhm = new HashMap[String, Int](){
       put(key1, value1)
       put(key2, value2)
    }

    Esto realmente funciona igual de bien en Java (excepto para exigir la doble llaves {{}}), pero es mucho más idiomático en la Scala.

    Creo que no existe algo así como la inicialización estática de un objeto. Supongo que usted se refiere a una instancia de inicializador, no?
    Correcto. Edición
    Técnicamente, Scala no tiene instancia de inicializadores. El código que muestras es la ejecución de la put métodos dentro de la constructor de la clase interna anónima.
    trabajó como un encanto y fácil de entender
    Error de compilación: no encontrado: valor de poner

    OriginalEl autor Dave Griffith

  3. 3

    Edificio en Randall’s respuesta, puede utilizar JavaConversions a ayudar un poco.

    import collection.JavaConversions.asMap
    import java.util.HashMap
    val jhm = new HashMap[Int,String](Map(1->"one", 2->"two"))

    OriginalEl autor huynhjl

  4. 0

    Todos los métodos y constructores de java.util.HashMap están disponibles para usted, por supuesto, pero que no proporciona un método para inicializar un mapa a menos que tenga otro para el suministro de los valores iniciales. El más cercano usted está probablemente va a obtener es:

    import java.util.HashMap
    val jhm = new HashMap[String, Int]
    «code to add key-value pairs to jhm»

    OriginalEl autor Randall Schulz

  5. 0

    A hacer algo reutilizables sería posible crear un nuevo «Mapa» subtipo sólo para la sintaxis de inicialización.

    Podría funcionar algo como esto (estoy ignorando los genéricos porque yo no los uso regularmente y yo probablemente conseguir algo mal):

    HashMap hm=new HashMap(
        new InitMap(
            new String[]{"one", "two", "three"},
            new int[]   {  1  ,   2  ,    3   };
        )
    );

    Habría más código que participan en el InitMap clase pero sería reutilizable y bastante sencillo (me gusta inicialización de matrices sintaxis para este tipo de cosas).

    Pensando en ello, el InitMap clase no sería demasiado difícil. Quizás quieras averiguar qué métodos se llama y se acaba de implementar esas. Las posibilidades son lo único que haría sería llamar a el conjunto de claves y EntrySet métodos.

    De curso a este ritmo podría sencillo crear un método auxiliar que tomó las dos matrices y devuelve un HashMap o ampliar HashMap y agregar un nuevo constructor…

    OriginalEl autor Bill K

Dejar respuesta

Please enter your comment!
Please enter your name here