在不同的scala.collection对象之间进行转换的最有效方法是什么?
E.g。
val a=scala.collection.mutable.ListBuffer(1,2,0,3)
我希望得到scala.collection.mutable.ArrayBuffer
。
根据http://docs.scala-lang.org/resources/images/collections.mutable.png,之后可以转换为Buffer
和ArrayBuffer
。正确的吗?
一般情况下,我可以通过共同的祖先在scala集合中进行任何转换吗? (在前面的例子中,共同的祖先是Buffer
)
PS我读过http://docs.scala-lang.org/overviews/collections/introduction.html但是找不到各种类型之间的一般转换(我知道.toArray之类的方法)
THX
答案 0 :(得分:3)
语法最有效应该是2.10中引入的to
方法:
def to[Col[_]]: Col[A]
通过复制所有元素将此集合转换为另一个集合。 注意:对于无限大小的集合,不会终止。
将其用作a.to[scala.collection.mutable.ArrayBuffer]
。
效率方面,除非您执行类似向上转换的转换,其中将子类型转换为更通用的集合,转换将涉及复制元素。在您的示例中,将列表缓冲区转换为缓冲区然后转换为数组缓冲区并不重要 - 您可以使用to
直接执行此操作,因为您将链接列表中的元素复制到数组中无论哪种方式。
答案 1 :(得分:1)
回答第2个问题:
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_07).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import collection.mutable._
import collection.mutable._
scala> List(1,2,3,4,5)
res0: List[Int] = List(1, 2, 3, 4, 5)
scala> res0.to[ArrayBuffer]
res1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)
scala> res0.to[ListBuffer]
res2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 5)
只要保持兼容性,您就可以按照自己的意愿进行转换:
scala> res0.to[Map]
<console>:12: error: scala.collection.mutable.Map takes two type parameters, expected: one
res0.to[Map]
^