2011-12-15 63 views
13

使用Scala 2.9版本存在一个方便的转换器从java.util.List等收藏到Scala的数据结构,通过写这样的转换开始:时间JavaConverters asScala方法的复杂

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

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

不过,我不确定所涉及的时间和空间复杂度和官方文件中找不到任何东西,因此,以下问题:

我在哪里可以得到在复杂信息(时间和空间) JavaConverters?

回答

19

各种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集合转换为斯卡拉,然后回Java产生了原来的集合,而不是双层包装。

+0

`JListWrapper`来自`JavaConversions`,而不是`JavaConverters`。是否有任何文件提供这些关系,包括恒定时间?我在API文档中找不到任何关于此的内容。 – Frank 2011-12-15 12:00:34