Qual é a diferença entre JavaConverters e JavaConversions no Scala?

Em scala.collection , existem dois objects muito semelhantes JavaConversions e JavaConverters .

  • Qual é a diferença entre esses dois objects?
  • Por que ambos existem?
  • Quando eu quero usar um contra o outro?

JavaConversions fornece uma série de methods implícitos que convertem entre uma coleção Java e a coleção Scala correspondente mais próxima e vice-versa. Isso é feito criando invólucros que implementam a interface Scala e encaminham as chamadas para a coleção Java subjacente ou a interface Java, encaminhando as chamadas para a coleção Scala subjacente.

JavaConverters usa o padrão pimp-my-library para “adicionar” o método asScala às collections Java e o método asJava às collections Scala, que retornam os wrappers apropriados discutidos acima. É mais recente (desde a versão 2.8.1) do que JavaConversions (desde 2.8) e torna explícita a conversão entre Scala e Java collection. Ao contrário do que David escreve em sua resposta, eu recomendo que você crie o hábito de usar JavaConverters pois você terá muito menos probabilidade de escrever código que faça muitas conversões implícitas, já que você pode controlar o único ponto onde isso ocorrerá. acontecer: onde você escreve .asScala ou .asJava .

Aqui estão os methods de conversão que os JavaConverters fornecem:

 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] 

Para usar as conversões diretamente do Java, é melhor você chamar methods diretamente do JavaConversions ; por exemplo:

 List javaList = new ArrayList(Arrays.asList("a", "b", "c")); System.out.println(javaList); // [a, b, c] Buffer scalaBuffer = JavaConversions.asScalaBuffer(javaList); System.out.println(scalaBuffer); // Buffer(a, b, c) List javaListAgain = JavaConversions.bufferAsJavaList(scalaBuffer); System.out.println(javaList == javaListAgain); // true 

Para qualquer um que aceda a esta questão desde o Scala 2.12.x, o JavaConversions está agora obsoleto e o JavaConverters é o método preferido.

Conforme explicado na API, JavaConversions é um conjunto de conversões implícitas que transforma collections java em coleção scala relacionada.

Você pode usá-lo com uma import collection.JavaConversions._ . Quando necessário, o compilador transformará automaticamente a coleção java no tipo correto de scala.

JavaConverters são um conjunto de decoradores que ajuda a transformar collections java ou scala em collections scala ou java usando os methods asJava ou asJava que serão implicitamente adicionados à coleção que você deseja transformar. Para usar esses conversores, você precisa importar:

 import collection.JavaConverters._ 

Você deve preferir JavaConversions , pois é geralmente mais fácil de usar (não é necessário usar asScala ou asJava ).