JavaConverters asScala方法的时间复杂度

时间:2011-12-15 09:13:24

标签: java scala scala-java-interop

从Scala版本2.9开始,有一个方便的转换器可以通过写这样的东西从java.util.List和其他集合转换为Scala的数据结构:

import scala.collection.JavaConverters._
def scalaVersion = callJavaMethod.asScala

这是一个可爱的小功能,因为它允许在与现有Java代码交互时利用Scala的优势。

但是,我不确定所涉及的时间和空间复杂性,并且在官方文档中找不到任何内容,因此,以下问题:

在哪里可以获得有关JavaConverters复杂性(时间和空间)的信息?

1 个答案:

答案 0 :(得分:20)

各种JavaConverters类正在使用Adapter模式来包装原始Java集合(underlying)并提供Scala接口。因此,转换和访问转换后的集合在时间上都是恒定的(O(1)),只会产生很小的开销。

例如,这是JListWrapper的完整源代码:

case class JListWrapper[A](val underlying : java.util.List[A]) extends mutable.Buffer[A] {
    def length = underlying.size
    override def isEmpty = underlying.isEmpty
    override def iterator : Iterator[A] = underlying.iterator
    def apply(i : Int) = underlying.get(i)
    def update(i : Int, elem : A) = underlying.set(i, elem)
    def +=:(elem : A) = { underlying.subList(0, 0).add(elem) ; this } 
    def +=(elem : A): this.type = { underlying.add(elem); this }
    def insertAll(i : Int, elems : Traversable[A]) = { val ins = underlying.subList(0, i) ;  elems.seq.foreach(ins.add(_)) }
    def remove(i : Int) = underlying.remove(i)
    def clear = underlying.clear
    def result = this
}

另请注意,将Java集合转换为Scala然后再转换回Java会产生原始集合,而不是双包装。