Quelle est la différence entre JavaConverters et JavaConversions dans Scala?

Dans scala.collection , il existe deux objects très similaires, JavaConversions et JavaConverters .

  • Quelle est la différence entre ces deux objects?
  • Pourquoi existent-ils tous les deux?
  • Quand est-ce que je veux utiliser l’un contre l’autre?

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