为什么TraversableOnce.toSeq会返回一个流?

时间:2014-10-17 19:31:16

标签: scala scala-collections

以下是一个例子:

scala> val xs = List(1,2,3).toIterator.toSeq
xs: Seq[Int] = Stream(1, ?)

序列是物化集合(默认情况下是List),所以我希望toSeq返回List,而不是Stream

实施在TraversableOnce中,

  def toSeq: Seq[A] = toStream

为什么它在TraversableLike中没有被覆盖?

1 个答案:

答案 0 :(得分:6)

Scala支持无限迭代器,Stream是可能无限数据最简单的Seq

Iterator.from(1).toSeq

终止(如果只使用了集合的一部分),但

Iterator.from(1).toList

永远不会终止。

如果同样有效的决定没有,你不想要破解代码。 toSeq方法不知道迭代器的来源,因此它必须假设它可能是无限的。

文档"解释"这个决定是这样的:

  

将此可遍历或迭代器转换为序列。和。一样   toIterable,它在这个默认实现中是懒惰的,就像这样   TraversableOnce可能是懒惰的,没有评估。   注意:对于无限大小的集合,不会终止。

http://www.scala-lang.org/api/current/?_ga=1.200291566.1390086478.1406220121#scala.collection.Iterator