2011-12-15 66 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