web-dev-qa-db-fra.com

Conversion d'une collection Java en une collection Scala

Lié à la question Stack Overflow équivalent Scala du nouveau HashSet (Collection), comment convertir un Java (Java.util.List dire) dans une collection Scala List?

J'essaie actuellement de convertir un Java appel API à Spring'sSimpleJdbcTemplate, 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( ... ) ) : _ *)
86
oxbow_lakes

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 rendu disponible par défaut grâce à Predef.scala.

16
Jorge Ortiz

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 ça.

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

123
robinst

Si vous voulez être plus explicite que les JavaConversions démontrées dans 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
62
Ben James

JavaConversions ( réponse de robinst ) et JavaConverters ( réponse de Ben James ) sont déconseillés avec Scala 2.10 .

Au lieu de JavaConversions utilisez:

import scala.collection.convert.wrapAll._

comme suggéré par aleksandr_hramcov .

Au lieu de JavaConverters utilisez:

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 que JavaConversions et JavaConverters étaient obsolètes semble être obsolète faux. Il y avait des propriétés déconseillées dans Scala 2.10, ce qui a entraîné des avertissements de dépréciation lors de leur importation. Les importations alternatives ici ne semblent donc être que des alias. Bien que je les préfère toujours, à mon humble avis, les noms sont plus approprié.

25
stempler

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

val list = new Java.util.ArrayList[Java.lang.String]
list.add("A")
list.add("B")
list.asScala
14
Surya Suravarapu
val array = Java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])
4
jamesqiu

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

import collection.convert.wrapAll._
2

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 peut être préférable car le package de collections subit une refonte majeure pour Scala 2.8 et le package scala.collection.jcl est s'en aller

2
Aaron

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
Fabian Steeg

Démarrage Scala 2.13, paquet scala.jdk.CollectionConverters remplace les packages 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")
0
Xavier Guihot