Pregunta

En relación con Stack Overflow pregunta Scala equivalente de nueva HashSet (Colección) , ¿Cómo se convierte una colección de Java (java.util.List decir) en una colección Scala List?

De hecho, estoy tratando de convertir una llamada a la API de Java para de primavera SimpleJdbcTemplate, que devuelve un java.util.List<T>, en un HashSet inmutable Scala. Así, por ejemplo:

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

Esto parece funcionar. La crítica es bienvenida!

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

Solución

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

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

Tenga en cuenta que scala.collection.immutable.Set se pone a disposición por defecto gracias a Predef.scala.

Otros consejos

Para futuras consultas: Con Scala 2.8, se podría hacer de esta manera:

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

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

También vea Ben James' respuesta para una mayor de manera explícita (usando JavaConverters), que parece ser recomendado ahora.

Si quieres ser más explícito que los JavaConversions se manifestaron en de robinst responder, puede utilizar 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 JavaConversions uso:

import scala.collection.convert.wrapAll._

aleksandr_hramcov .

En lugar de JavaConverters uso:

import scala.collection.convert.decorateAll._

Por tanto también existe la posibilidad de importar sólo 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 quedaron en desuso parece estar mal. Había algunas propiedades en desuso en Scala 2,10, lo que resultó en los avisos de obsolescencia al importarlos. Por lo que las importaciones alternos aquí parecen ser sólo alias. Aunque todavía los prefiero, ya que en mi humilde opinión los nombres son más apropiados.

También es posible que desee explorar esta excelente biblioteca: scalaj-colección que tiene de dos vías conversión entre las colecciones de Java y Scala. En su caso, para convertir una java.util.List a la lista de Scala se 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 el toArray llamar para hacer que el conjunto puede parametrizar:

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

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

Otra manera simple de resolver este problema:

import collection.convert.wrapAll._

Se puede convertir la colección de Java a una matriz y luego crear una lista de Scala que:

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

A partir Scala 2.13, paquete scala.jdk.CollectionConverters reemplaza paquetes scala.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")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top