Scala 中的 JavaConverters 和 JavaConversions 有什么区别?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8301947/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What is the difference between JavaConverters and JavaConversions in Scala?
提问by Michael Ekstrand
In scala.collection, there are two very similar objects JavaConversionsand JavaConverters.
在 中scala.collection,有两个非常相似的对象JavaConversions和JavaConverters。
- What is the difference between these two objects?
- Why do they both exist?
- When do I want to use one vs. the other?
- 这两个对象有什么区别?
- 为什么它们都存在?
- 我什么时候想使用一个和另一个?
回答by Jean-Philippe Pellet
EDIT: Java Conversionsgot @deprecatedin Scala 2.13.0. Use scala.jdk.CollectionConvertersinstead.
编辑:Java Conversions进入@deprecatedScala 2.13.0。请改用scala.jdk.CollectionConverters。
JavaConversionsprovide a series of implicit methods that convert between a Java collection and the closest corresponding Scala collection, and vice versa. This is done by creating wrappers that implement either the Scala interface and forward the calls to the underlying Java collection, or the Java interface, forwarding the calls to the underlying Scala collection.
JavaConversions提供一系列隐式方法,可以在 Java 集合和最接近的对应 Scala 集合之间进行转换,反之亦然。这是通过创建实现 Scala 接口并将调用转发到底层 Java 集合或 Java 接口,将调用转发到底层 Scala 集合的包装器来完成的。
JavaConvertersuses the pimp-my-library pattern to “add” the asScalamethod to the Java collections and the asJavamethod 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 JavaConvertersas 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 .asScalaor .asJava.
JavaConverters使用 pimp-my-library 模式将asScala方法“添加”到 Java 集合中,并将asJava方法“添加”到 Scala 集合中,这会返回上述适当的包装器。它比JavaConversions(自 2.8 起)更新(自 2.8.1 版起),并使 Scala 和 Java 集合之间的转换变得明确。与大卫在他的回答中所写的相反,我建议您养成使用的习惯,JavaConverters因为您编写进行大量隐式转换的代码的可能性要小得多,因为您可以控制发生这种情况的唯一地方: 你在哪里写.asScala或.asJava。
Here's the conversion methods that JavaConvertersprovide:
以下是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]
To use the conversions directly from Java, though, you're better off calling methods from JavaConversionsdirectly; e.g.:
但是,要直接从 Java 使用转换,最好直接从 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
回答by Ryan Burke
For anyone landing on this question since Scala 2.12.x, JavaConversionsis now deprecated and JavaConvertersis the preferred method.
对于自 Scala 2.12.x 以来遇到此问题的任何人,JavaConversions现在已弃用并且JavaConverters是首选方法。
回答by Mario Galic
In Scala 2.13, JavaConvertershave been deprecatedin favour of scala.jdk.CollectionConverters:
在斯卡拉2.13,JavaConverters已经过时赞成scala.jdk.CollectionConverters:
...new package
scala.jdkwith objectsCollectionConverters(classic Java collections, similar tocollection.JavaConvertersin 2.12),StreamConverters,FunctionConvertersandOptionConverters...
......新的封装
scala.jdk与对象CollectionConverters(经典Java集合,类似于collection.JavaConverters2.12)StreamConverters,FunctionConverters并OptionConverters...
回答by David
As explained in the API, JavaConversionsis a set of implicit conversions that transforms java collections into related scala collection.
正如 API 中所解释的,JavaConversions是一组隐式转换,将 java 集合转换为相关的 Scala 集合。
You can use it with an import collection.JavaConversions._. When necessary, the compiler will automatically transform the java collection into the right scala type.
您可以将它与import collection.JavaConversions._. 必要时,编译器会自动将 java 集合转换为正确的 Scala 类型。
JavaConvertersare a set of decorator that helps transform java or scala collections to scala or java collections using asScalaor asJavamethods that will be implicitly added to the collection that you want to transform. In order to use these converters, you need to import :
JavaConverters是一组装饰器,可帮助将 java 或 scala 集合转换为 scala 或 java 集合,使用asScala或asJava将隐式添加到要转换的集合中的方法。为了使用这些转换器,您需要导入:
import collection.JavaConverters._
You should prefer JavaConversionsas it's generally easier to use (no need to use asScalaor asJava).
您应该更喜欢JavaConversions它,因为它通常更易于使用(无需使用asScala或asJava)。

