Scala 中的 JavaConverters 和 JavaConversions 有什么区别? [英] What is the difference between JavaConverters and JavaConversions in Scala?
问题描述
在scala.collection
,有两个非常相似的对象 JavaConversions
和 JavaConverters
.
- 这两个对象有什么区别?
- 为什么它们都存在?
- 我想在什么时候使用一个和另一个?
推荐答案
Java Conversions
在 Scala 2.13.0 中得到了 @deprecated
.请改用 scala.jdk.CollectionConverters.
Java Conversions
got @deprecated
in Scala 2.13.0. Use scala.jdk.CollectionConverters instead.
JavaConversions
提供了一系列隐式方法,可以在 Java 集合和最接近的对应 Scala 集合之间进行转换,反之亦然.这是通过创建实现 Scala 接口并将调用转发到底层 Java 集合或 Java 接口,将调用转发到底层 Scala 集合的包装器来完成的.
JavaConversions
provide 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.
JavaConverters
使用 pimp-my-library 模式将 asScala
方法添加"到 Java 集合中,将 asJava
方法添加"到Scala 集合,它返回上面讨论的适当的包装器.它比 JavaConversions
(自 2.8 起)更新(自 2.8.1 版起),并使 Scala 和 Java 集合之间的转换变得明确.与 David 在他的回答中所写的相反,我建议您养成使用 JavaConverters
的习惯,因为您编写进行大量隐式转换的代码的可能性要小得多,因为您可以控制发生这种情况的唯一地方:您编写 .asScala
或 .asJava
的地方.
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
提供的转换方法:
Here's the conversion methods that JavaConverters
provide:
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
调用方法;例如:
To use the conversions directly from Java, though, you're better off calling methods from JavaConversions
directly; e.g.:
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 中的 JavaConverters 和 JavaConversions 有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!