在上一篇文章《再看Kafka Lag》中笔者提及了Scala与Java集合互转的内容,但是并未有详述,本文对此做一个补充说明,方便在使用的时候可以随时翻阅。
对于集合而言,Scala从2.8.1开始引入scala.collection.JavaConverters用于Scala与Java集合的互转。在scala代码中如果需要集合转换,首先引入scala.collection.JavaConverters._,进而显示调用asJava或者asScala方法完成转型。与此雷同的scala.collection.JavaConversions已被标注为@Deprecated(since 2.12.0),JavaConversions可以做到隐式转换,即不需要asJava或者asScala的调用,但是这样可能会对阅读造成障碍,可能会让人难以知晓什么变成了什么。笔者这里罗列出JavaConverters支持的互转类型(内容来源于源码注释)。
以下可以通过asScala和asJava进行互转:
* scala.collection.Iterable <=> java.lang.Iterable
* scala.collection.Iterator <=> java.util.Iterator
* scala.collection.mutable.Buffer <=> java.util.List
* scala.collection.mutable.Set <=> java.util.Set
* scala.collection.mutable.Map <=> java.util.Map
* scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap以下可以通过asScala将Java的转成Scala的,通过特殊的命名(如asJavaCollection)将Scala的转成Java的:
* scala.collection.Iterable <=> java.util.Collection (via asJavaCollection)
* scala.collection.Iterator <=> java.util.Enumeration (via asJavaEnumeration)
* scala.collection.mutable.Map <=> java.util.Dictionary (via asJavaDictionary)以下可以通过asJava进行Scala到Java的单向转换:
* scala.collection.Seq => java.util.List
* scala.collection.mutable.Seq => java.util.List
* scala.collection.Set => java.util.Set
* scala.collection.Map => java.util.Map以下可以通过asScala进行Java到Scala的单向转换:
* java.util.Properties => scala.collection.mutable.Map
在所有情形下,从原始类型转变到对侧类型之后再转变回来的话会是同一个对象,举例
import scala.collection.JavaConverters._ |
另外,转换方法也有其描述性的名称可供显示调用,举例如下:
scala> val vs = java.util.Arrays.asList("hi", "bye") |