以下是一个例子:
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中没有被覆盖?
答案 0 :(得分:6)
Scala支持无限迭代器,Stream
是可能无限数据最简单的Seq
。
Iterator.from(1).toSeq
终止(如果只使用了集合的一部分),但
Iterator.from(1).toList
永远不会终止。
如果同样有效的决定没有,你不想要破解代码。
toSeq
方法不知道迭代器的来源,因此它必须假设它可能是无限的。
文档"解释"这个决定是这样的:
将此可遍历或迭代器转换为序列。和。一样 toIterable,它在这个默认实现中是懒惰的,就像这样 TraversableOnce可能是懒惰的,没有评估。 注意:对于无限大小的集合,不会终止。