Временная сложность метода JavaConverters asScala - PullRequest
15 голосов
/ 15 декабря 2011

Начиная с Scala версии 2.9, существует удобный конвертер для преобразования из java.util.List и других коллекций в структуры данных Scala, написав что-то вроде этого:

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

Это прекрасная маленькая функция, так какпозволяет использовать преимущества Scala при взаимодействии с существующим кодом Java.

Однако я не уверен в сложности времени и пространства и не смог найти ничего в официальной документации, следовательно, следующий вопрос:

Где я могу получить информацию о сложности (времени и пространстве) JavaConverters?

1 Ответ

20 голосов
/ 15 декабря 2011

Различные JavaConverters классы используют Адаптер шаблон, чтобы обернуть оригинальную коллекцию 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 дает исходную коллекцию, а не двойную оболочку.

...