Question

associés à Stack Overflow question Scala équivalent de nouvelle HashSet (Collection) , comment puis-je convertir une collection Java (dire java.util.List) dans une collection Scala List?

Je suis en train d'essayer de convertir un appel API Java de printemps SimpleJdbcTemplate, qui retourne un java.util.List<T>, dans un immuable Scala HashSet. Ainsi, par exemple:

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

Cela semble fonctionner. La critique est la bienvenue!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)
Était-ce utile?

La solution

Votre suggestion fonctionne, mais vous pouvez également éviter d'utiliser jcl.Buffer:

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

Notez que est mis à la disposition scala.collection.immutable.Set par défaut grâce à Predef.scala.

Autres conseils

Pour référence future: Avec Scala 2.8, il pourrait se faire comme ceci:

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

set est un scala.collection.immutable.Set[String] après.

Voir aussi Ben de réponse James pour un plus de manière explicite (en utilisant JavaConverters), qui semble maintenant être recommandé.

Si vous voulez être plus explicite que les JavaConversions ont démontré dans robinst de répondre , vous pouvez utiliser JavaConverters:

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

JavaConversions ( réponse de robinst ) et JavaConverters (réponse de Ben James ) ont été désapprouvée avec Scala 2.10 .

Au lieu de JavaConversions utilisation:

import scala.collection.convert.wrapAll._

tel que suggéré par aleksandr_hramcov .

Au lieu de JavaConverters utilisation:

import scala.collection.convert.decorateAll._

Pour les deux il y a aussi la possibilité de n'importer les conversions / convertisseurs à Java ou Scala, respectivement, par exemple:.

import scala.collection.convert.wrapAsScala._

Mise à jour: La déclaration ci-dessus que JavaConversions et JavaConverters ont été désapprouvées semble se tromper. Il y avait quelques propriétés dépréciées à Scala 2.10, ce qui a entraîné des avertissements de désapprobation lors de leur importation. Ainsi, les importations alternatives semblent ici être alias seulement. Bien que je préfère encore eux, comme à mon humble avis les noms sont plus appropriés.

Vous pouvez aussi explorer cette excellente bibliothèque: scalaj-collection qui a deux voies la conversion entre les collections Java et Scala. Dans votre cas, pour convertir un java.util.List à la liste Scala vous pouvez faire ceci:

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])

Vous pouvez ajouter les informations de type dans le toArray appeler pour l'ensemble être paramétrées:

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

Il peut être préférable que l'ensemble des collections passe par une refonte majeure pour Scala 2.8 et le package est scala.collection.jcl en aller

Une autre façon simple de résoudre ce problème:

import collection.convert.wrapAll._

Vous pouvez convertir la collection Java à un tableau, puis créer une liste Scala de ce qui suit:

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

À partir Scala 2.13, package

scroll top