在下面的代码中,我迭代一个数组中的迭代器,并按预期输出:
val array = Array(List("1").iterator) //> array : Array[Iterator[String]] = Array(non-empty iterator)
for(a <- array){
//a.size
for(element <- a){
println(element) //> 1
}
}
但是如果我添加a.size
,似乎这会将迭代器光标推到集合的末尾,因为迭代器显示为空:
val array = Array(List("1").iterator) //> array : Array[Iterator[String]] = Array(non-empty iterator)
for(a <- array){
a.size
for(element <- a){
println(element)
}
}
为什么会这样?检查元素的大小应该对集合的迭代产生影响吗?看大小方法:
def size: Int = {
var result = 0
for (x <- self) result += 1
result
}
它没有修改迭代器本身吗?
在Scala工作表
中尝试了这些示例答案 0 :(得分:5)
因为在迭代器上调用.size
要求它迭代所有元素以便对它们进行计数。
编辑以详细说明:
迭代器具有状态:在任何给定点,调用其next
函数返回下一个元素并使其状态前进。为了遇到所有元素(例如计算它们),它必须调用next
直到没有更多元素。那时,它的状态就在最后,因此迭代器不再有用了。
在相关的说明中,请参阅TraversableOnce,这是您应该只追踪过的事情的特征。有一次他们变得无用之前。迭代器就是这样的一个。