Im scala.collection
gibt es zwei sehr ähnliche Objekte JavaConversions
und JavaConverters
.
BEARBEITEN: Java Conversions
Hat @deprecated
In Scala= 2.13.0. Verwenden Sie stattdessen scala.jdk.CollectionConverters .
JavaConversions
stellt eine Reihe impliziter Methoden bereit, die zwischen einer Java Sammlung und der nächsten entsprechenden Scala Sammlung konvertieren und umgekehrt. Dies erfolgt durch Erstellen von Wrappern, die entweder die Scala= - Schnittstelle implementieren und die Aufrufe an die zugrunde liegende Java - Sammlung oder die Java - Schnittstelle weiterleiten Weiterleiten der Aufrufe an die zugrunde liegende Sammlung Scala.
JavaConverters
verwendet das Muster "pimp-my-library", um die asScala
-Methode zu den Java= Sammlungen und die asJava
-Methode zu "hinzufügen" Scala Sammlungen, die die oben beschriebenen Wrapper zurückgeben. Es ist neuer (seit Version 2.8.1) als JavaConversions
(seit 2.8) und führt die Konvertierung zwischen Scala und Java Sammlung explizit. Entgegen dem, was David in seiner Antwort schreibt, würde ich empfehlen, dass Sie es sich zur Gewohnheit machen, JavaConverters
so zu verwenden, wie Sie wollen Es ist weniger wahrscheinlich, dass Sie Code schreiben, der viele implizite Konvertierungen durchführt, da Sie die einzige Stelle steuern können, an der dies geschieht: an der Sie .asScala
oder .asJava
schreiben.
Hier sind die Konvertierungsmethoden, die JavaConverters
bereitstellen:
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]
Um die Konvertierungen jedoch direkt aus Java zu verwenden, sollten Sie Methoden von JavaConversions
direkt aufrufen. z.B.:
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
Für alle, die seit Scala 2.12.x) auf dieser Frage landen, ist JavaConversions
jetzt veraltet und JavaConverters
ist die bevorzugte Methode.
Wie in der API erläutert, ist JavaConversions
eine Menge impliziter Konvertierungen, die Java Sammlungen in verwandte scala Sammlung.
Sie können es mit einem import collection.JavaConversions._
. Bei Bedarf wandelt der Compiler die Java= - Auflistung automatisch in den richtigen scala - Typ um.
JavaConverters
sind eine Reihe von Dekoratoren, die helfen, Java oder scala Sammlungen zu scala oder Java Sammlungen mit asScala
oder asJava
Methoden, die implizit zu der Sammlung hinzugefügt werden, die Sie transformieren möchten. Um diese zu verwenden Konverter müssen Sie importieren:
import collection.JavaConverters._
Sie sollten JavaConversions
bevorzugen, da die Verwendung im Allgemeinen einfacher ist (es ist nicht erforderlich, asScala
oder asJava
zu verwenden).
In Scala 2.13, JavaConverters
wurde veraltet zugunsten von scala.jdk.CollectionConverters
:
... neues Paket
scala.jdk
mit ObjektenCollectionConverters
(klassisch Java Sammlungen, ähnlichcollection.JavaConverters
in 2.12),StreamConverters
,FunctionConverters
undOptionConverters
...