Conversión de una colección Java en una colección Scala

Relacionado con Stack Overflow question Scala equivalente al nuevo HashSet (Collection) , ¿cómo convierto una colección de Java ( java.util.List say) en una List colección Scala?

En realidad, estoy tratando de convertir una llamada API de Java a SimpleJdbcTemplate de Spring , que devuelve un java.util.List , en un HashSet inmóvil de Scala. Así por ejemplo:

 val l: java.util.List[String] = javaApi.query( ... ) val s: HashSet[String] = //make a set from l 

Esto parece funcionar ¡Crítica es bienvenida!

 import scala.collection.immutable.Set import scala.collection.jcl.Buffer val s: scala.collection.Set[String] = Set(Buffer(javaApi.query( ... ) ) : _ *) 

Su última sugerencia funciona, pero también puede evitar el uso de jcl.Buffer :

 Set(javaApi.query(...).toArray: _*) 

Tenga en cuenta que scala.collection.immutable.Set está disponible de forma predeterminada gracias a Predef.scala .

Para referencia futura: con Scala 2.8, se podría hacer así:

 import scala.collection.JavaConversions._ val list = new java.util.ArrayList[String]() list.add("test") val set = list.toSet 

set es un scala.collection.immutable.Set[String] después de esto.

También vea la respuesta de Ben James de una manera más explícita (usando JavaConverters), que parece ser recomendado ahora.

Si quiere ser más explícito que las JavaConversions demostradas en la respuesta de robinst , puede usar JavaConverters:

 import scala.collection.JavaConverters._ val l = new java.util.ArrayList[java.lang.String] val s = l.asScala.toSet 

JavaConversions ( respuesta de robinst ) y JavaConverters ( respuesta de Ben James ) han quedado en desuso con Scala 2.10 .

En lugar de utilizar JavaConversions :

 import scala.collection.convert.wrapAll._ 

como lo sugiere aleksandr_hramcov .

En lugar de utilizar JavaConverters :

 import scala.collection.convert.decorateAll._ 

Para ambos también existe la posibilidad de importar solo las conversiones / convertidores a Java o Scala respectivamente, por ejemplo:

 import scala.collection.convert.wrapAsScala._ 

Actualización: la afirmación anterior de que JavaConversions y JavaConverters estaban en desuso parece estar equivocada. Hubo algunas propiedades en desuso en Scala 2.10, lo que resultó en advertencias de depreciación al importarlas. Entonces, las importaciones alternativas aquí parecen ser solo alias. Aunque todavía los prefiero, como en mi humilde opinión los nombres son más apropiados.

También puede explorar esta excelente biblioteca: scalaj-collection que tiene una conversión bidireccional entre las colecciones de Java y Scala. En su caso, para convertir una lista java.util.List en Scala List, puede hacer esto:

 val list = new java.util.ArrayList[java.lang.String] list.add("A") list.add("B") list.asScala 
 val array = java.util.Arrays.asList("one","two","three").toArray val list = array.toList.map(_.asInstanceOf[String]) 

Puede agregar la información de tipo en la llamada aArray para hacer que el conjunto esté parametrizado:

  val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*) 

Esto podría ser preferible ya que el paquete de colecciones está pasando por una revisión importante para Scala 2.8 y el paquete scala.collection.jcl se va a ir

Otra forma simple de resolver este problema:

 import collection.convert.wrapAll._ 

Puede convertir la colección de Java en una matriz y luego crear una lista de Scala a partir de eso:

 val array = java.util.Arrays.asList("one","two","three").toArray val list = List.fromArray(array)