object iterator02 {
/**
* 1. next() 获取当前的元素, 移动一次迭代器
* 2. hasNext 判断是否有下一个元素
* 3. drop(n) 从当前位置开始, 跳过 n 个元素, 它返回一个新的迭代器
*/
def main(args: Array[String]): Unit = {
// 获取一个迭代器
val it = List(1,2,3,4).iterator
//
println(it.next())
println(it.next())
println(it.next())
println(it.next())
//
println(it.next()) // NoSuchElementException: head of empty list
val it1 = it.drop(2)
while(it1.hasNext){
println(it1.next()) // 3, 4
}
}
}
- 陷阱 1:耗尽的迭代器调用next()。解决方案:始终用hasNext()做前置判断。
- 陷阱 2:认为drop(n)会修改原迭代器。解决方案:明确drop(n)返回新迭代器,原迭代器状态不变。
- 陷阱 3:重复使用已遍历的迭代器。解决方案:若需多次遍历,先将迭代器转换为非惰性集合(如 List)。
- 陷阱 4:多线程操作迭代器。迭代器不是线程安全的,多线程环境下需加锁或使用线程安全的迭代器实现。