Scala与Java集合互转摘要

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
  2. 以下可以通过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)
  3. 以下可以通过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
  4. 以下可以通过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)

欢迎支持笔者的作品《深入理解Kafka: 核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客(ID: hiddenkafka)。
本文作者: 朱小厮

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×