wake-up-neo.com

Was ist der Unterschied zwischen JavaConverters und JavaConversions in Scala?

Im 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 benutzen?
194

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
248

Für alle, die seit Scala 2.12.x) auf dieser Frage landen, ist JavaConversions jetzt veraltet und JavaConverters ist die bevorzugte Methode.

50
Ryan Burke

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).

3
David

In Scala 2.13, JavaConverters wurde veraltet zugunsten von scala.jdk.CollectionConverters:

... neues Paket scala.jdk mit Objekten CollectionConverters (klassisch Java Sammlungen, ähnlich collection.JavaConverters in 2.12), StreamConverters, FunctionConverters und OptionConverters...

2
Mario Galic