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.Listejemplo) 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.toSetsetes 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
JavaConversionstiene algunas implicaciones que hacen que latoSetllamada 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.toSetfuente
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.asScalafuente
Comenzando
Scala 2.13, el paquetescala.jdk.CollectionConvertersreemplaza 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