Подтвердить что ты не робот

Временная сложность метода JavaConverters asScala

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

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

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

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

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

4b9b3361

Ответ 1

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