web-dev-qa-db-fra.com

Quelle est la différence entre les convertisseurs Java et les conversions Java dans Scala?

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

  • Quelle est la différence entre ces deux objets?
  • Pourquoi les deux existent-ils?
  • Quand est-ce que je veux utiliser l'un par rapport à l'autre?
194
Michael Ekstrand

MODIFIER: Java Conversions eu @deprecated in Scala 2.13.0. Utilisez scala.jdk.CollectionConverters) .

JavaConversions fournit une série de méthodes implicites qui convertissent une collection Java en une collection Scala la plus proche), et inversement. Ceci est effectué en créant des wrappers qui implémentent soit l'interface Scala et transmettent les appels à la collection sous-jacente Java, ou l'interface Java , en transférant les appels vers la collection sous-jacente Scala.

JavaConverters utilise le modèle pimp-my-library pour “ajouter” la méthode asScala aux collections Java et la méthode asJava à la Scala collections, qui renvoient les wrappers appropriés décrits ci-dessus. Il est plus récent (depuis la version 2.8.1) que JavaConversions (depuis la 2.8) et effectue la conversion entre Scala et Java explicite. Contrairement à ce que David a écrit dans sa réponse, je vous recommanderais de prendre l'habitude d'utiliser JavaConverters comme vous le feriez. réduisez considérablement le nombre de conversions implicites, car vous pouvez contrôler le seul endroit où cela se produira: où vous écrivez .asScala ou .asJava.

Voici les méthodes de conversion que JavaConverters fournit:

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, il vaut mieux appeler des méthodes directement à partir de JavaConversions; 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
248

Pour tous ceux qui abordent cette question depuis Scala 2.12.x, JavaConversions est désormais obsolète et JavaConverters est la méthode préférée.

50
Ryan Burke

Comme expliqué dans l'API, JavaConversions est un ensemble de conversions implicites qui transforme Java des collections en associations connexes scala collection.

Vous pouvez l'utiliser avec un import collection.JavaConversions._. Lorsque cela est nécessaire, le compilateur transformera automatiquement la collection Java en un fichier de droite scala.

JavaConverters sont un ensemble de décorateurs qui permettent de transformer Java ou scala des collections à scala ou Java collections utilisant asScala ou asJava méthodes qui seront implicitement ajoutées à la collection que vous souhaitez transformer. Pour les utiliser convertisseurs, vous devez importer:

import collection.JavaConverters._

Vous devriez préférer JavaConversions car il est généralement plus facile à utiliser (inutile d'utiliser asScala ou asJava).

3
David

Dans Scala 2.13, JavaConverters ont été obsolète en faveur de scala.jdk.CollectionConverters:

... nouveau package scala.jdk avec des objets CollectionConverters (classiques Java, similaires à collection.JavaConverters en 2.12), StreamConverters, FunctionConverters et OptionConverters...

2
Mario Galic