Scala与Java集合互转摘要

在上一篇文章《再看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支持的互转类型(内容来源于源码注释)。
1. 以下可以通过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
  1. 以下可以通过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)
  1. 以下可以通过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
  1. 以下可以通过asScala进行Java到Scala的单向转换:
*    java.util.Properties => scala.collection.mutable.Map

在所有情形下,从原始类型转变到对侧类型之后再转变回来的话会是同一个对象,举例

import scala.collection.JavaConverters._

val source = new scala.collection.mutable.ListBuffer[Int]
val target: java.util.List[Int] = source.asJava
val other: scala.collection.mutable.Buffer[Int] = target.asScala
assert(source eq other)

另外,转换方法也有其描述性的名称可供显示调用,举例如下:

scala> val vs = java.util.Arrays.asList("hi", "bye")
vs: java.util.List[String] = [hi, bye]

scala> val ss = asScalaIterator(vs.iterator)
ss: Iterator[String] = non-empty iterator

scala> .toList
res0: List[String] = List(hi, bye)

scala> val ss = asScalaBuffer(vs)
ss: scala.collection.mutable.Buffer[String] = Buffer(hi, bye)

欢迎支持《RabbitMQ实战指南》以及关注微信公众号:朱小厮的博客。

猜你喜欢

转载自blog.csdn.net/u013256816/article/details/80057661