斯卡拉:什么是特质TraversableOnce? TraversableOnce和Traversable之间的区别是什么?

时间:2015-12-31 08:03:17

标签: scala

TraversableOnce:"集合的模板特征,可以只遍历一次或一次多次。"

我不明白这句话。为什么可以遍历?不仅一次吗? 谢谢!

3 个答案:

答案 0 :(得分:15)

Scaladoc也说

  

这个特性主要是为了消除Iterator和Traversable之间的代码重复,从而实现一些只能在foreach方面实现而无法访问Builder的常用方法。

迭代器只能“遍历”一次。可以遍历Traversable多次。

基本上,TraversableOnce是一个接口,它抽象出你如何处理Iterators和Traversables。您的代码可以接收Iterator或Traversable,并以完全相同的方式处理它们!

为了很好地解释收藏库中使用的许多特征,我相信the Scala 2.8 Collections Design Tutorial的大多数(如果不是全部)仍然是正确的。

答案 1 :(得分:1)

因为有些东西只能遍历一次,例如:

Iterator.continually(readline)

表达式将创建一个迭代器,但它只能遍历一次,否则它必须存储所有读取数据,这在大多数情况下都是浪费。

许多容器可以根据需要遍历多次,例如ArrayMap等等

如果可以多次遍历Traversable,则可以遍历一次。所以所有Traversable也是TraversableOnce ,TraversableOnce可以至少遍历一次,但也可以多次遍历。

答案 2 :(得分:0)

请注意,在Scala 2.13(2019年6月)中,没有更多的TraversableTraversableOnce:它们仅作为IterableIterableOnce的别名使用。 (最初是Collections rework的一部分)

IterableOnce也有相同的句子:

  

集合的模板特征,该特征只能被遍历一次,也可以被遍历一次。

这次:

  

目标是提供一个没有任何顺序操作的最小接口。
  这样,第三方扩展(例如Scala并行集合)就可以在IterableOnce级别进行集成,而无需继承不需要的实现。