Scala 的迭代器
迭代器定义:迭代器不是一种集合,它是一种用于访问集合的方法。
迭代器需要通过集合对应的迭代器调用迭代器的方法来访问。
支持函数式编程风格,便于链式操作。
创建一个迭代器,相关代码如下:
object Test {
def main(args: Array[String]): Unit = {
val list1 = List(1,2,3,4,5)
//任务:输出每一个元素
// list1.foreach(println)
//任务:跳过前两个,从第3个开始输出
//迭代器
//1.创建一个迭代器(iterator)
val it1 = list1.iterator
val it2 = it1.drop(2)
//依次访问每个元素
while (it2.hasNext){
println(it2.next())
}
}
}
运行结果如下:
drop:从当前位置开始,跳过指定数量的元素,得到新的迭代器
take:从当前位置开始,取几个元素,得到新的迭代器
toList的作用:把迭代器中剩余的元素保存到一个List中
zip方法(拉链):把两个迭代器合成一下,得到新的迭代器,长度以短的为准
相关代码如下:
object Test {
def main(args: Array[String]): Unit = {
val list1 = List(1, 2, 3, 4, 5)
//任务:输出每一个元素
//list1.foreach(println)
//任务:跳过前两个,从第3个开始输出
//迭代器
//1.创建一个迭代器(iterator)
val it1 = list1.iterator
val it2 = it1.drop(2)
//2.依次访问每个元素
// hasNext()是否有下一个
// next():得到当前的元素,并把迭代器向后移动一个位置
while (it2.hasNext) {
println(it2.next())
}
println(it2.hasNext)
val list2 = List(1,2,3)
val it3 = list2.iterator
it3.next()
it3.next()
it3.next()
//it3.next() //NoSuchElementException 没有这个元素。迭代器移过头了!!!
//迭代器的使用场景:Map,List,Set.....都可以使用迭代器来遍历
val m1 = Map("11"->1,"22"->2)
val s1 = Set("A","B","C")
val it4 = s1.iterator
while (it4.hasNext){
println(it4.next())
}
println("-"*20)
//任务是:打印前3个
val list4 = List(1,2,3,4,5,6,7)
val it5 = list4.iterator
//take:从当前的迭代器的位置开始,取n个元素
val it6 = it5.take(3)
while (it6.hasNext){
println(it6.next())
}
//只输出4,5,6 跳过前3个,再取3个
val it7 = list4.iterator.drop(3).take(3)
while (it7.hasNext){
println(it7.next())
}
//复制迭代器 duplicate 返回值是一个元组,有两个一样的,独立的迭代器
// 特点:不能回头
val list8 = List("A","B","C")
val (it8, it9) = list8.iterator.duplicate
while (it8.hasNext){
println(it8.next())
}
println("-"*20)
println(it9.next())
println("-"*20)
//作用:把迭代器中剩余的数据保存到List中
val list9 = List(1,2,3,4)
val it10 = list9.iterator
it10.next()
// it10.next()
val list10 = it10.toList // 剩下的数据保存到List中
println(list10)
//zip:拉链
//作用:把两个迭代器组合成一个,以短的为准!
val it11 = List(1,2,3,4,5,6,7,8).iterator
val it12 = List("one","two","three","four","five").iterator
val it13 = it11.zip(it12)
while (it13.hasNext){
val rs = it13.next() //元组
println(s"${rs._1} ---> ${rs._2}")
// 目标:输出
// 1 ---> one
// 2 ---> two
}
}
}
运行结果如下: