Conversion d'une collection Java en une collection Scala


Lié à la question de débordement de pileÉquivalent Scala de new HashSet (Collection) , comment convertir une collection Java (java.util.List say) en une collection Scala List?

J'essaie en fait de convertir un appel d'API Java en Spring SimpleJdbcTemplate, qui renvoie un java.util.List<T>, dans un Scala immuable 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( ... ) ) : _ *)
Author: Community, 2009-03-23

9 answers

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

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

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

 16
Author: Jorge Ortiz, 2013-09-08 19:10:04

Pour référence future: Avec Scala 2.8, cela pourrait être fait 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 ce.

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

 121
Author: robinst, 2017-05-23 12:25:48

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

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
 59
Author: Ben James, 2017-05-23 12:02:02

JavaConversions (réponse de robinst ) et JavaConverters (La réponse de Ben James ) a été dépréciée avec Scala 2.10.

Au Lieu de JavaConversions utiliser:

import scala.collection.convert.wrapAll._

, tel Que suggéré par aleksandr_hramcov.

Au Lieu de JavaConverters utiliser:

import scala.collection.convert.decorateAll._

Pour les deux, il est également possible d'importer uniquement les conversions/convertisseurs vers Java ou Scala respectivement, par exemple:

import scala.collection.convert.wrapAsScala._

Mise à Jour: La déclaration ci-dessus selon laquelle JavaConversions et JavaConverters étaient obsolètes semble être fausse. Il y avait des propriétés obsolètes dans Scala 2.10, ce qui a entraîné des avertissements de dépréciation lors de leur importation. Donc, les importations alternatives ici semblent n'être que des alias. Bien que je les préfère encore, comme IMHO les noms sont plus appropriés.

 25
Author: stempler, 2017-05-23 11:54:21

Vous pouvez également explorer cette excellente bibliothèque: scalaj-collection qui a une conversion bidirectionnelle entre les collections Java et Scala. Dans votre cas, pour convertir un java.util.Liste de Scala Liste, vous pouvez faire ceci:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
 14
Author: Surya Suravarapu, 2010-05-12 18:47:30
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])
 4
Author: jamesqiu, 2010-10-14 08:30:41

Vous pouvez ajouter les informations de type dans l'appel toArray pour paramétrer l'ensemble:

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

Cela pourrait être préférable car le paquet collections est en train de subir une refonte majeure pour Scala 2.8 et la scala.collection.le paquet jcl est en train de disparaître

 2
Author: Aaron, 2010-03-23 19:43:10

Un Autre moyen simple de résoudre ce problème:

import collection.convert.wrapAll._
 2
Author: aleksandr_hramcov, 2014-03-07 05:38:26

Vous pouvez convertir la collection Java en tableau, puis créer une liste Scala à partir de cela:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
 1
Author: Fabian Steeg, 2009-03-23 18:50:03