从Scala版本2.9开始,有一个方便的转换器可以通过写这样的东西从java.util.List
和其他集合转换为Scala的数据结构:
import scala.collection.JavaConverters._
def scalaVersion = callJavaMethod.asScala
这是一个可爱的小功能,因为它允许在与现有Java代码交互时利用Scala的优势。
但是,我不确定所涉及的时间和空间复杂性,并且在官方文档中找不到任何内容,因此,以下问题:
在哪里可以获得有关JavaConverters复杂性(时间和空间)的信息?
答案 0 :(得分:20)
各种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会产生原始集合,而不是双包装。