2011-12-15 2 views
13

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

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

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

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

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

ответ

19

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

+0

'JListWrapper' - это' JavaConversions', а не 'JavaConverters'. Есть ли какой-либо документ, где эти отношения, включая постоянное время, даются? Я не могу найти ничего об этом в документе API. – Frank

+0

@Frank: '.asScala' из' JavaConverters' использует 'JListWrapper' из' JavaConversions'. К сожалению, я не могу найти что-либо, документирующее сложность времени. –

+0

Спасибо. Я соглашусь с этим на отсутствие других ответов, хотя я немного разочарован тем, что ничто из этого не документировано вообще. – Frank