Dans scala.collection
, il existe deux objets très similaires JavaConversions
et JavaConverters
.
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
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.
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
).
Dans Scala 2.13, JavaConverters
ont été obsolète en faveur de scala.jdk.CollectionConverters
:
... nouveau package
scala.jdk
avec des objetsCollectionConverters
(classiques Java, similaires àcollection.JavaConverters
en 2.12),StreamConverters
,FunctionConverters
etOptionConverters
...