16

从 Scala 2.9 版开始,有一个方便的转换器,可以java.util.List通过编写如下内容将其他集合转换为 Scala 的数据结构:

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

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

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

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

4

1 回答 1

21

各种JavaConverters类都使用适配器模式来包装原始 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 会产生原始集合,而不是双重包装器。

于 2011-12-15T09:21:12.137 回答