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 contra el otro?
En scala.collection
, hay dos objetos muy similares JavaConversions
y JavaConverters
.
Respuestas:
EDITAR: Java Conversions
consiguió @deprecated
en Scala 2.13.0. Utilice scala.jdk.CollectionConverters en su lugar.
JavaConversions
Proporcionar una serie de métodos implícitos que convierten entre una colección Java y la colección Scala correspondiente más cercana, y viceversa. Esto se realiza creando envoltorios que implementan la interfaz Scala y reenvían las llamadas a la colección Java subyacente, o la interfaz Java, reenvían las llamadas a la colección Scala subyacente.
JavaConverters
utiliza el patrón pimp-my-library para "agregar" el asScala
método a las colecciones de Java y el asJava
método a las colecciones de Scala, que devuelven los contenedores apropiados que se discutieron anteriormente. Es más reciente (desde la versión 2.8.1) que JavaConversions
(desde la 2.8) y hace explícita la conversión entre Scala y la colección Java. Contrariamente a lo que David escribe en su respuesta, le recomiendo que se acostumbre a usarlo, JavaConverters
ya que será mucho menos probable que escriba código que realice muchas conversiones implícitas, ya que puede controlar el único lugar donde eso sucederá : donde escribes .asScala
o .asJava
.
Aquí están los métodos de conversión que JavaConverters
proporcionan:
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 usar las conversiones directamente desde Java, es mejor llamar a los métodos JavaConversions
directamente; 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
JavaConversions
son convenientes, puede pasar por alto rápidamente todos los lugares donde el compilador puede insertarlas. Tú controlas esos lugares con JavaConverters
. Es toda la discusión sobre la conversión implícita vs explícita.
import JavaConversions._
, las conversiones no ocurrirán, por lo que tendrá el control sobre lo que se convierte. Si realiza la importación de la manera correcta (solo cuando sea necesario), tiene control total sobre dónde se realiza la conversión.
JavaConverters
usted tiene la seguridad adicional de que no pasa nada a menos que lo escriba explícitamente. Esa es una seguridad adicional, y probablemente es por eso que se agregó esta clase.
Para cualquiera que llegue a esta pregunta desde Scala 2.12.x, JavaConversions
ahora está en desuso y JavaConverters
es el método preferido.
JavaConverters
está en desuso y scala.jdk.CollectionConverters
es el método preferido;)
En Scala 2.13, JavaConverters
han quedado en desuso a favor de scala.jdk.CollectionConverters
:
... nuevo paquete
scala.jdk
con objetosCollectionConverters
(colecciones clásicas de Java, similares a lascollection.JavaConverters
de 2.12)StreamConverters
,FunctionConverters
yOptionConverters
...
Como se explica en la API, JavaConversions
es un conjunto de conversiones implícitas que transforma las colecciones java en colecciones scala relacionadas.
Puedes usarlo con un import collection.JavaConversions._
. Cuando sea necesario, el compilador transformará automáticamente la colección java en el tipo de escala correcto.
JavaConverters
son un conjunto de decorador que ayuda a transformar las colecciones de Java o scala scala a las colecciones o Java utilizando asScala
o asJava
métodos que serán añadidos de forma implícita a la colección que desea transformar. Para utilizar estos convertidores, debe importar:
import collection.JavaConverters._
Usted debe preferir JavaConversions
, ya que es generalmente más fácil de usar (sin necesidad de utilizar asScala
o asJava
).