En relación con la pregunta de Stack Overflow equivalente a Scala del nuevo HashSet (Colección) , ¿cómo convierto una colección de Java (por java.util.List
ejemplo) en una colección de Scala List
?
De hecho, estoy tratando de convertir una llamada a la API de Java en Spring SimpleJdbcTemplate
, que devuelve a java.util.List<T>
, en un Scala inmutable HashSet
. Así por ejemplo:
val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l
Esto parece funcionar. ¡Las críticas son bienvenidas!
import scala.collection.immutable.Set
import scala.collection.jcl.Buffer
val s: scala.collection.Set[String] =
Set(Buffer(javaApi.query( ... ) ) : _ *)
java
scala
scala-collections
scala-2.7
oxbow_lakes
fuente
fuente
Para referencia futura: Con Scala 2.8, podría hacerse así:
import scala.collection.JavaConversions._ val list = new java.util.ArrayList[String]() list.add("test") val set = list.toSet
set
es unscala.collection.immutable.Set[String]
después de esto.También vea la respuesta de Ben James para una forma más explícita (usando JavaConverters), que parece recomendarse ahora.
fuente
JavaConversions
tiene algunas implicaciones que hacen que latoSet
llamada no sea necesaria.Si desea 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
fuente
JavaConversions ( respuesta de robinst ) y JavaConverters ( respuesta de Ben James ) han quedado obsoletos con Scala 2.10 .
En lugar de JavaConversions, utilice:
import scala.collection.convert.wrapAll._
como sugiere aleksandr_hramcov .
En lugar de JavaConverters use:
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 declaración anterior de que JavaConversions y JavaConverters estaban en desuso parece ser incorrecta. Hubo algunas propiedades en desuso en Scala 2.10, lo que resultó en advertencias de desuso al importarlas. Entonces, las importaciones alternativas aquí parecen ser solo alias. Aunque todavía los prefiero, en mi humilde opinión, los nombres son más apropiados.
fuente
Es posible que también desee explorar esta excelente biblioteca: scalaj-collection que tiene conversión bidireccional entre las colecciones de Java y Scala. En su caso, para convertir un java.util.List a Scala List, puede hacer esto:
val list = new java.util.ArrayList[java.lang.String] list.add("A") list.add("B") list.asScala
fuente
Comenzando
Scala 2.13
, el paquetescala.jdk.CollectionConverters
reemplaza a los paquetesscala.collection.JavaConverters/JavaConversions._
:import scala.jdk.CollectionConverters._ // val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three") javaList.asScala // collection.mutable.Buffer[String] = Buffer("one", "two", "three") javaList.asScala.toSet // collection.immutable.Set[String] = Set("one", "two", "three")
fuente
val array = java.util.Arrays.asList("one","two","three").toArray val list = array.toList.map(_.asInstanceOf[String])
fuente
Puede agregar la información de tipo en la llamada toArray para hacer que el Set sea 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 va a desaparecer.
fuente
Puede convertir la colección de Java en una matriz y luego crear una lista Scala a partir de eso:
val array = java.util.Arrays.asList("one","two","three").toArray val list = List.fromArray(array)
fuente
Otra forma sencilla de solucionar este problema:
import collection.convert.wrapAll._
fuente