16

Scalaバージョン2.9以降、java.util.List次のように記述することで、他のコレクションからScalaのデータ構造に変換するための便利なコンバーターが存在します。

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

これは、既存のJavaコードと対話するときにScalaの利点を活用できるので、素敵な小さな機能です。

ただし、関連する時間とスペースの複雑さについては不明であり、公式ドキュメントには何も見つかりませんでした。したがって、次の質問があります。

JavaConvertersの複雑さ(時間とスペース)に関する情報はどこで入手できますか?

4

1 に答える 1

21

さまざまな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に戻すと、ダブルラッパーではなく元のコレクションが生成されることに注意してください。

于 2011-12-15T09:21:12.137 に答える