如何将Scala的Iterable或collection.Seq转换为collection.immutable.Seq?

44
在Scala集合中,似乎toSeq方法返回一个scala.collection.Seq,我也可以返回一个Traversable或Iterable,但需要将其转换为scala.collection.immutable.Seq。是否有简单的方法可以做到这一点呢?谢谢,Richard。
1个回答

78

在Scala 2.10中,使用to方法在任意集合类型之间进行转换:

scala> Array(1, 2, 3).toSeq
res0: Seq[Int] = WrappedArray(1, 2, 3)

scala> Array(1, 2, 3).to[collection.immutable.Seq]
res1: scala.collection.immutable.Seq[Int] = Vector(1, 2, 3)

1
你的回答对我很有帮助,但是为什么需要这样做呢?我只是在使用不可变集合,为什么for-yield的结果需要使用.to呢? - akauppi
2
我的朋友伊万·尤尔琴科澄清了这一点:问题在于有三个东西: A)scala.collection.Seq B)scala.collection.immutable.Seq C)scala.collection.mutable.SeqB和C都是从A派生而来的,因此,如果我们有A,我们不能确定它是可变的还是不可变的,这就是为什么需要显式转换(.toList或其他方式)或从一开始就将它们设置为不可变的原因。 - akauppi
1
这很奇怪,因为在Scala中默认的Seq只是collections.Seq;这很奇怪,因为大多数情况下,所有东西都是不可变的。List(1,2,3).toSeq生成了一个collections.Seq...而不是不可变的collections.Seq。这不是看起来有些不对吗? - PlexQ
更奇怪的是,immutable.collections.Seq.toIterable 返回一个 collections.Iterable,而不是 immutable.collections.Iterable! - PlexQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接