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