In scala.collection
gibt es zwei sehr ähnliche Objekte JavaConversions
und JavaConverters
.
- Was ist der Unterschied zwischen diesen beiden Objekten?
- Warum existieren beide?
- Wann möchte ich eins gegen das andere verwenden?
In scala.collection
gibt es zwei sehr ähnliche Objekte JavaConversions
und JavaConverters
.
Antworten:
EDIT: Java Conversions
bekam @deprecated
in Scala 2.13.0. Verwenden Sie stattdessen scala.jdk.CollectionConverters .
JavaConversions
Stellen Sie eine Reihe impliziter Methoden bereit, die zwischen einer Java-Sammlung und der nächstgelegenen entsprechenden Scala-Sammlung konvertieren und umgekehrt. Dazu werden Wrapper erstellt, die entweder die Scala-Schnittstelle implementieren und die Aufrufe an die zugrunde liegende Java-Sammlung oder die Java-Schnittstelle weiterleiten und die Aufrufe an die zugrunde liegende Scala-Sammlung weiterleiten.
JavaConverters
verwendet das pimp-my-library-Muster, um die asScala
Methode zu den Java-Sammlungen und die asJava
Methode zu den Scala-Sammlungen hinzuzufügen , die die oben beschriebenen entsprechenden Wrapper zurückgeben. Es ist neuer (seit Version 2.8.1) als JavaConversions
(seit 2.8) und macht die Konvertierung zwischen Scala und Java-Sammlung explizit. Im Gegensatz zu dem, was David in seiner Antwort schreibt, würde ich empfehlen, dass Sie es sich zur Gewohnheit machen, es zu verwenden, JavaConverters
da Sie mit viel geringerer Wahrscheinlichkeit Code schreiben, der viele implizite Konvertierungen durchführt, da Sie den einzigen Ort steuern können, an dem dies geschehen wird : wo du schreibst .asScala
oder .asJava
.
Hier sind die Konvertierungsmethoden, die Folgendes JavaConverters
bieten:
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 direkt von Java aus zu verwenden, sollten Sie Methoden besser direkt von Java aus aufrufen JavaConversions
. 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
JavaConversions
sind, können Sie schnell alle Stellen übersehen, an denen sie vom Compiler eingefügt werden können. Sie kontrollieren diese Orte mitJavaConverters
. Es ist die ganze Diskussion über implizite oder explizite Konvertierung.
import JavaConversions._
, werden keine Conversions durchgeführt, sodass Sie die Kontrolle darüber haben, was konvertiert wird. Wenn Sie den Import richtig platzieren (nur bei Bedarf), haben Sie die volle Kontrolle darüber, wo die Konvertierung durchgeführt wird.
JavaConverters
Ihnen haben Sie die zusätzliche Sicherheit, dass nichts passiert, wenn Sie es nicht explizit schreiben. Das ist eine zusätzliche Sicherheit, und das ist höchstwahrscheinlich der Grund, warum diese Klasse hinzugefügt wurde.
Für alle, die seit Scala 2.12.x auf dieser Frage landen, JavaConversions
ist sie jetzt veraltet und JavaConverters
die bevorzugte Methode.
JavaConverters
veraltet ist und scala.jdk.CollectionConverters
die bevorzugte Methode ist;)
In Scala 2,13, JavaConverters
wurde als veraltet für scala.jdk.CollectionConverters
:
... neues Paket
scala.jdk
mit ObjektenCollectionConverters
(klassische Java-Sammlungen, ähnlich wiecollection.JavaConverters
in 2.12)StreamConverters
,FunctionConverters
undOptionConverters
...
Wie in der API erläutert, JavaConversions
handelt es sich um eine Reihe impliziter Konvertierungen, mit denen Java-Sammlungen in verwandte Scala-Sammlungen umgewandelt werden.
Sie können es mit einem verwenden import collection.JavaConversions._
. Bei Bedarf wandelt der Compiler die Java-Sammlung automatisch in den richtigen Scala-Typ um.
JavaConverters
ist eine Reihe von Dekorateur , die mit Java oder scala Sammlungen zu scala oder Java - Sammlungen helfen verwandeln asScala
oder asJava
Methoden , die implizit in der Sammlung hinzugefügt werden , dass Sie transformieren mögen. Um diese Konverter verwenden zu können, müssen Sie Folgendes importieren:
import collection.JavaConverters._
Sie sollten es vorziehen, JavaConversions
da es im Allgemeinen einfacher zu bedienen ist (keine Notwendigkeit zu verwenden asScala
oder asJava
).