207 votes

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

En scala.collection, il y a deux objets similaires JavaConversions et JavaConverters.

  • Quelle est la différence entre ces deux objets?
  • Pourquoi ils existent?
  • Quand dois-je utiliser l'un contre l'autre?

265voto

Jean-Philippe Pellet Points 25240

JavaConversions fournir une série d'implicite des méthodes de conversion entre un Java de collecte le plus proche correspondant Scala collection, et vice versa. Ceci est fait par la création de wrappers de mise à la Scala de l'interface et de transférer les appels vers le sous-jacent Java collection, ou de l'interface Java, de transférer les appels à la sous-jacentes de la Scala de collecte.

JavaConverters utilise le pimp-my-bibliothèque de modèle à "ajouter" asScala méthode de la Java des collections et de l' asJava méthode à la Scala de collections, de retour approprié wrappers discuté ci-dessus. Elle est plus récente (depuis la version 2.8.1) que JavaConversions (depuis 2.8) et fait la conversion entre Scala et Java collection explicite. Contrairement à ce que David a écrit dans sa réponse, je vous recommande de prendre l'habitude d'utiliser JavaConverters que vous serez beaucoup moins susceptibles d'écrire du code qui fait beaucoup de conversions implicites, que vous pouvez contrôler le seul endroit où va se produire: lorsque vous écrivez .asScala ou .asJava.

Voici les méthodes de conversion qu' JavaConverters fournir:

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[String, String]

Pour utiliser les conversions directement à partir de Java, bien que, vous êtes mieux de l'appel de méthodes à partir d' JavaConversions directement; par exemple:

List<String> javaList = new ArrayList<String>(Arrays.asList("a", "b", "c"));
System.out.println(javaList); // [a, b, c]
Buffer<String> scalaBuffer = JavaConversions.asScalaBuffer(javaList);
System.out.println(scalaBuffer); // Buffer(a, b, c)
List<String> javaListAgain = JavaConversions.bufferAsJavaList(scalaBuffer);
System.out.println(javaList == javaListAgain); // true

6voto

David Points 1376

Comme expliqué dans l'API (http://www.scala-lang.org/api/current/index.html#scala.collection.JavaConversions$), JavaConversions est un ensemble de conversions implicites qui transforme java collections dans d'autres scala collection.

Vous pouvez l'utiliser avec un import collection.JavaConversions._. Lorsque nécessaire, le compilateur va transformer automatiquement la java de collecte dans le droit scala type.

JavaConverters sont un ensemble de décorateur (http://www.scala-lang.org/api/current/index.html#scala.collection.JavaConverters$)qui permet de transformer java ou scala collections à la scala ou java collections à l'aide de asScala ou asJava méthodes qui seront implicitement ajouté à la collection que vous souhaitez transformer. Afin d'utiliser ces convertisseurs, vous devez l'importer :

import collection.JavaConverters._

Vous devriez préférer JavaConversions comme c'est généralement plus facile à utiliser (pas besoin d'utiliser asScala ou asJava).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X