Dans scala.collection
, il existe deux objects très similaires, JavaConversions
et JavaConverters
.
JavaConversions
fournit une série de méthodes implicites convertissant entre une collection Java et la collection Scala correspondante la plus proche, et inversement. Cela se fait en créant des wrappers qui implémentent soit l’interface Scala et transfèrent les appels à la collection Java sous-jacente, soit à l’interface Java, en transférant les appels vers la collection Scala sous-jacente.
JavaConverters
utilise le modèle pimp-my-library pour «append» la méthode asScala
aux collections Java et la méthode asJava
aux collections Scala, qui renvoient les wrappers appropriés décrits ci-dessus. Il est plus récent (depuis la version 2.8.1) que JavaConversions
(depuis 2.8) et rend explicite la conversion entre Scala et la collection Java. Contrairement à ce que David écrit dans sa réponse, je vous recommande de prendre l’habitude d’utiliser JavaConverters
car vous aurez beaucoup moins de chances d’écrire du code qui JavaConverters
beaucoup de conversions implicites, car vous pouvez contrôler le seul endroit où cela se produira. arrive: où vous écrivez .asScala
ou .asJava
.
Voici les méthodes de conversion JavaConverters
par JavaConverters
:
Pimped Type | Conversion Method | Returned Type ================================================================================================= scala.collection.Iterator | asJava | java.util.Iterator scala.collection.Iterator | asJavaEnumeration | java.util.Enumeration scala.collection.Iterable | asJava | java.lang.Iterable scala.collection.Iterable | asJavaCollection | java.util.Collection scala.collection.mutable.Buffer | asJava | java.util.List scala.collection.mutable.Seq | asJava | java.util.List scala.collection.Seq | asJava | java.util.List scala.collection.mutable.Set | asJava | java.util.Set scala.collection.Set | asJava | java.util.Set scala.collection.mutable.Map | asJava | java.util.Map scala.collection.Map | asJava | java.util.Map scala.collection.mutable.Map | asJavaDictionary | java.util.Dictionary scala.collection.mutable.ConcurrentMap | asJavaConcurrentMap | java.util.concurrent.ConcurrentMap ————————————————————————————————————————————————————————————————————————————————————————————————— java.util.Iterator | asScala | scala.collection.Iterator java.util.Enumeration | asScala | scala.collection.Iterator java.lang.Iterable | asScala | scala.collection.Iterable java.util.Collection | asScala | scala.collection.Iterable java.util.List | asScala | scala.collection.mutable.Buffer java.util.Set | asScala | scala.collection.mutable.Set java.util.Map | asScala | scala.collection.mutable.Map java.util.concurrent.ConcurrentMap | asScala | scala.collection.mutable.ConcurrentMap java.util.Dictionary | asScala | scala.collection.mutable.Map java.util.Properties | asScala | scala.collection.mutable.Map[Ssortingng, Ssortingng]
Pour utiliser les conversions directement à partir de Java, il est toutefois préférable d’appeler directement les méthodes de JavaConversions
; par exemple:
List javaList = new ArrayList (Arrays.asList("a", "b", "c")); System.out.println(javaList); // [a, b, c] Buffer scalaBuffer = JavaConversions.asScalaBuffer(javaList); System.out.println(scalaBuffer); // Buffer(a, b, c) List javaListAgain = JavaConversions.bufferAsJavaList(scalaBuffer); System.out.println(javaList == javaListAgain); // true
Pour quiconque atterrit sur cette question depuis Scala 2.12.x, JavaConversions
est maintenant obsolète et JavaConverters
est la méthode préférée.
Comme expliqué dans l’API, JavaConversions
est un ensemble de conversions implicites qui transforme les collections java en une collection scala associée.
Vous pouvez l’utiliser avec une import collection.JavaConversions._
. Si nécessaire, le compilateur transformera automatiquement la collection java en un type de scala correct.
JavaConverters
sont un ensemble de décorateurs qui permettent de transformer des collections java ou scala en collections scala ou java à l’aide des méthodes asScala
ou asJava
qui seront implicitement ajoutées à la collection que vous souhaitez transformer. Pour utiliser ces convertisseurs, vous devez importer:
import collection.JavaConverters._
Vous devriez préférer JavaConversions
car il est généralement plus facile à utiliser (pas besoin d’utiliser asScala
ou asJava
).