scala scala-collections scala-java-interop

¿Cuál es la diferencia entre JavaConverters y JavaConversions en Scala?



scala-collections scala-java-interop (3)

Como se explica en la API, JavaConversions es un conjunto de conversiones implícitas que transforma las colecciones de Java en una colección de scala relacionada.

Puede usarlo con una import collection.JavaConversions._ . import collection.JavaConversions._ . Cuando sea necesario, el compilador transformará automáticamente la colección de Java en el tipo de scala correcto.

JavaConverters son un conjunto de decoradores que ayuda a transformar las colecciones de java o scala en scala o colecciones java utilizando los métodos asScala o asJava que se agregarán implícitamente a la colección que desee transformar. Para usar estos convertidores, debe importar:

import collection.JavaConverters._

Debería preferir JavaConversions ya que generalmente es más fácil de usar (no es necesario usar asScala o asJava ).

En scala.collection , hay dos objetos muy similares JavaConversions y JavaConverters .

  • ¿Cuál es la diferencia entre estos dos objetos?
  • ¿Por qué ambos existen?
  • ¿Cuándo quiero usar uno frente al otro?

Para cualquier persona que aterrice en esta pregunta desde Scala 2.12.x, JavaConversions ahora está en desuso y JavaConverters es el método preferido.


JavaConversions proporciona una serie de métodos implícitos que convierten entre una colección Java y la colección Scala más cercana correspondiente, y viceversa. Esto se hace creando wrappers que implementan la interfaz de Scala y reenvían las llamadas a la colección de Java subyacente, o la interfaz de Java, reenviando las llamadas a la colección de Scala subyacente.

JavaConverters utiliza el patrón pimp-my-library para "agregar" el método asScala a las colecciones de Java y el método asJava a las colecciones de Scala, que devuelven los contenedores adecuados que se analizaron anteriormente. Es más nuevo (desde la versión 2.8.1) que JavaConversions (desde 2.8) y hace que la conversión entre Scala y la colección de Java sea explícita. Contrariamente a lo que David escribe en su respuesta, le recomiendo que JavaConverters hábito de usar JavaConverters ya que será menos probable que escriba código que JavaConverters muchas conversiones implícitas, ya que puede controlar el único lugar donde suceder: donde escribes .asScala o .asJava .

Aquí están los métodos de conversión que JavaConverters proporciona:

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]

Sin embargo, para utilizar las conversiones directamente desde Java, es mejor que JavaConversions directamente a los métodos desde JavaConversions ; p.ej:

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