【问题标题】:Time complexity of JavaConverters asScala methodJavaConverters asScala 方法的时间复杂度
【发布时间】:2012-01-21 00:05:51
【问题描述】:

从 Scala 2.9 版开始,有一个方便的转换器,可以通过编写如下代码将 java.util.List 和其他集合转换为 Scala 的数据结构:

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

这是一个可爱的小功能,因为它允许人们在与现有 Java 代码交互时利用 Scala 的优势。

但是,我不确定所涉及的时间和空间复杂性,并且在官方文档中找不到任何内容,因此,以下问题:

我在哪里可以获得有关 JavaConverters 复杂性(时间和空间)的信息?

【问题讨论】:

    标签: java scala scala-java-interop


    【解决方案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 会产生原始集合,而不是双重包装器。

    【讨论】:

    • JListWrapper 来自JavaConversions,而不是JavaConverters。是否有任何文件给出了这些关系,包括常数时间?我在 API 文档中找不到任何相关内容。
    • @Frank: 来自JavaConverters.asScala 使用来自JavaConversionsJListWrapper。不幸的是,我找不到任何记录时间复杂度的东西。
    • 谢谢。由于没有其他答案,我会接受它,但我有点失望,根本没有记录。
    • 随意打开一个问题,我认为这应该在 Scaladoc 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多