迭代器(Iterator)是 Scala 中处理集合元素的重要工具,它提供了一种按需访问集合元素的方式,无需一次性加载整个集合到内存,尤其适合处理大数据量集合。
一、迭代器的核心概念
Scala 中的迭代器是一个单向的、可遍历集合的对象,其核心特性:
- 惰性访问:迭代器不会一次性加载所有元素,而是在调用
next()时才获取下一个元素; - 单向移动:迭代器的指针只能向前移动,一旦移动到末尾,无法回退;
- 一次性使用:迭代器遍历完成后(指针到末尾),无法再次使用,需重新创建。
二、基础使用:遍历集合
首先从最基础的迭代器遍历集合开始,对比直接遍历集合和迭代器遍历的区别
scala
package it
/*
迭代器
*/
object it01 {
def main(args: Array[String]): Unit = {
val list1 = List(1, 2, 3, 4, 5) // 第一个列表(变量名唯一)
val list2 = List(11, 22, 33, 44, 55) // 第二个列表(重命名为 list2)
// 遍历 list1
list1.foreach(ele => println(ele))
// 遍历 list2(原代码重复遍历了 list1,这里修正为遍历第二个列表)
list2.foreach(ele => println(ele))
// 用迭代器遍历 list2(或根据需求选择 list1)
val iterator = list2.iterator
while (iterator.hasNext) {
println(iterator.next())
}
}
}
2.2 注意:next() 越界问题
迭代器的 next() 方法在没有下一个元素时会抛出 NoSuchElementException,必须通过 hasNext() 先判断:
代码如下
scala
package it
/*
迭代器
next()获取下一个,移动迭代器的位置,如果没有下一个就报错
hasNext判断当前是否存在下一个元素false true
drop()跳过指定数量的元素返回一个新的迭代器
take()跳过指定数量的元素返回一个新的迭代器
*/
object it02 {
def main(args: Array[String]): Unit = {
val it = List(1,2,3,4,5).iterator
println(it.next())
println(it.next())
println(it.next())
println(it.next())
println(it.next())
println(it.hasNext)
println(it.next())
// val it1=List(1,2,3,4,5,).iterator
// val it2 = it1.drop(2)
// while(it2.hasNext){
// println(it2.next())
}
val it3=List(1,2,3,4,5).iterator
it3.next()
it3.next()
val it4 = it3.take(2)
while(it4.hasNext){
println(it4.next())
}
}