tipos - Conversión de una colección Java en una colección Scala
tipos de collections (9)
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
Spring''s , que devuelve un java.util.List<T>
, 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( ... ) ) : _ *)
Otra forma simple de resolver este problema:
import collection.convert.wrapAll._
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.
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
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)
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
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
.
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
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.
val array = java.util.Arrays.asList("one","two","three").toArray
val list = array.toList.map(_.asInstanceOf[String])