【发布时间】:2016-04-05 05:37:16
【问题描述】:
TraversableOnce:“集合的模板特征,可以仅遍历一次或一次或多次。”
我不明白这句话。为什么可以遍历更多次?不是只有一次吗? 谢谢!
【问题讨论】:
标签: scala
TraversableOnce:“集合的模板特征,可以仅遍历一次或一次或多次。”
我不明白这句话。为什么可以遍历更多次?不是只有一次吗? 谢谢!
【问题讨论】:
标签: scala
请注意,对于 Scala 2.13(2019 年 6 月),不再有 Traversable 和 TraversableOnce:它们仅作为 Iterable 和 IterableOnce 的已弃用别名保留。 (最初是Collections rework的一部分)
IterableOnce也有同一句话:
集合的模板特征,可以只遍历一次,也可以遍历一次或多次。
这次:
目标是提供一个没有任何顺序操作的最小接口。
这允许第三方扩展(如 Scala 并行集合)在IterableOnce级别集成,而不会继承不需要的实现。
【讨论】:
因为有些东西只能遍历一次,例如:
Iterator.continually(readline)
表达式会创建一个迭代器,但只能遍历一次,否则必须存储所有读取的数据,这在大多数情况下是一种浪费。
许多容器可以任意多次遍历,比如Array、Map等等
如果一个 Traversable 可以被多次遍历,那么它肯定可以被遍历一次。所以所有的 Traversable 也是 TraversableOnce,TraversableOnce 可以被至少遍历一次,也可以被多次遍历。
【讨论】:
Scaladoc 也说
此 trait 的存在主要是为了消除 Iterator 和 Traversable 之间的代码重复,因此实现了一些可以仅根据
foreach实现而无需访问 Builder 的常用方法。
迭代器只能被“遍历”一次。一个 Traversable 可以被遍历多次。
本质上,TraversableOnce 是一个抽象出您如何处理迭代器和 Traversable 的接口。您的代码可以接收 Iterator 或 Traversable 并以完全相同的方式处理它们!
为了很好地解释 Collections 库中使用的许多特征,我相信大部分(如果不是全部)the Scala 2.8 Collections Design Tutorial 仍然是正确的。
【讨论】: