在scala中。集合中有两个非常相似的对象JavaConversions和JavaConverters。

这两个物体有什么区别? 为什么它们都存在? 什么时候我想使用一个和另一个?


正如API中解释的那样,JavaConversions是一组隐式转换,它将java集合转换为相关的scala集合。

您可以将它与导入collection.JavaConversions._一起使用。必要时,编译器会自动将java集合转换为正确的scala类型。

JavaConverters是一组装饰器,它帮助使用asScala或asJava方法将java或scala集合转换为scala或java集合,这些方法将隐式添加到您想转换的集合中。为了使用这些转换器,你需要导入:

import collection.JavaConverters._

你应该更喜欢JavaConversions,因为它通常更容易使用(不需要使用asScala或asJava)。


编辑:Java转换在Scala 2.13.0中已被@弃用。请改用scala.jdk.CollectionConverters。

JavaConversions提供了一系列隐式方法,可以在Java集合和最接近的对应Scala集合之间进行转换,反之亦然。这是通过创建包装器来实现的,包装器实现Scala接口并将调用转发到底层Java集合,或者Java接口将调用转发到底层Scala集合。

JavaConverters uses the pimp-my-library pattern to “add” the asScala method to the Java collections and the asJava method to the Scala collections, which return the appropriate wrappers discussed above. It is newer (since version 2.8.1) than JavaConversions (since 2.8) and makes the conversion between Scala and Java collection explicit. Contrary to what David writes in his answer, I'd recommend you make it a habit to use JavaConverters as you'll be much less likely to write code that makes a lot of implicit conversions, as you can control the only spot where that will happen: where you write .asScala or .asJava.

下面是JavaConverters提供的转换方法:

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]

不过,要直接从Java使用转换,最好直接从JavaConversions调用方法;例如:

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

对于Scala 2.12以来遇到这个问题的任何人。JavaConversions现在已弃用,JavaConverters是首选方法。


在Scala 2.13中,JavaConverters已经被弃用,取而代之的是Scala .jdk. collectionconverters:

...新包scala。jdk使用对象CollectionConverters (经典的Java集合,类似于集合。JavaConverters在 2.12), StreamConverters, FunctionConverters和OptionConverters…