scala的迭代器

7 阅读2分钟

迭代器的定义

迭代器 Iterator是一种用于遍历集合元素的对象。它提供了统一的方式来访问各种集合类 型(如列表List、映射Map、集合Set等)中的元素,而不需要了解集合的内部结构。

在 Scala 中,迭代器是一种抽象的概念,它有特定的接口和方法来实现元素的遍历。

 iterator方法创建对应的迭代器,这个迭代器可以用于遍历列表中的元素。

/*
* List(1,2,3,4,5)
* */
object iterator01 {
  def main(args: Array[String]): Unit = {

    val list1 = scala.collection.immutable.List(1,2,3,4,5)

//    list1.foreach(ele => {
//      println(ele)
//    })   1 2 3 4 5

    // 跳过list的前面两个元素,输出后两个元素
    val it = list1.iterator
    val it1 = it.drop(2).take(2)
    while(it1.hasNext){
      println(it1.next())  //3 4
    }
  }
}

next方法获取一个元素

package iterator
/*
*  迭代器.next() 获取当前元素,移动迭代器
* */

object iterator02 {
  def main(args: Array[String]): Unit = {
    val list1 = List(1,2,3,4,5)
    // 访问这五个元素:
    
    // 1.获取迭代器
    val it = list1.iterator  //默认指向第一个元素
    
    // 2.移动迭代器
//   val value = it.next()  // 获取,移动
//   println(value)  //  1

    // 3.输出对应的值
    println(it.next()) // 1
    println(it.next()) // 2
    println(it.next()) // 3
    println(it.next()) // 4
    println(it.next()) // 5

    println(it.next()) // 越界  会报错 java.util.NoSuchElementException: head of empty list
  }
}

hasNext方法检查是否还有下一个元素,防止越界

    // 访问这五个元素:
    
    // 1.获取迭代器
    val it = list1.iterator  //默认指向第一个元素

    // 2.移动迭代器
//   val value = it.next()    // 获取,移动
//   println(value)  //  1

    // 3.输出对应的值
//    println(it.next()) // 1
//    println(it.next()) // 2
//    println(it.next()) // 3
//    println(it.next()) // 4
//    println(it.next()) // 5

    if(it.hasNext){
      println(it.next())
    }
//  println(it.next()) // 越界  会报错 java.util.NoSuchElementException: head of empty list

drop方法会跳过指定数量的元素,take方法会获取指定数量的元素

package iterator

/*
*   drop:跳过指定个数的元素drop(3)
*   take:获取指定数量的元素
*/
object iterator03 {
  def main(args: Array[String]): Unit = {
    val list1 = List(1,2,3,4,5)

    val it = list1.iterator

    val it2 = it.drop(1)  // 跳过一个元素
    while (it2.hasNext){
     println(it2.next())
    }
    
    println("---------------")
    
    val it3 = it.take(3) //从当前位置开始,只获取两个元素
    while (it3.hasNext){
      println(it3.next())  // 1 2 3
    }
  }
}

duplicate方法会复制迭代器

package iterator

// 迭代器是一次性的,一旦next之后就不能回头

object iterator04 {
  def main(args: Array[String]): Unit = {
    val list1 = List(1,2,3,4,5)
    val it = list1.iterator

    val (it1,it2) = it.duplicate
    it1.next() // 一次性
    it1.next()
    while (it.hasNext){
      println(it.next())   // 3 4 5
    }
    
    println("-------------------")
    
    while(it2.hasNext){
      println(it2.next())  // 1 2
    }
  }
}

toList方法会把迭代器中剩余的元素转入一个新的List中

package iterator

object iterator05 {
  def main(args: Array[String]): Unit = {
    val list1 = List(1,2,3,4,5)

    val it = list1.iterator
    it.next()
    it.next()
    println(it.next()) // 3
    
    // 希望把剩下的内容,装入一个新的List
    val newList = it.toList
    println(newList)  // List(4, 5)
  }
}

zip方法会将两个迭代器的元素按照顺序组合成一个新的迭代器。

如果长度不一,会以短的为准

package iterator

object iterator06 {
  def main(args: Array[String]): Unit = {
    val it1 = List(1,2,3,4,5,6).iterator
    val it2 = List("one","two","three","four","five").iterator

    val it3 = it1.zip(it2)

    while (it3.hasNext){
      val pair = it3.next()
      println(pair._1,pair._2) // (1,one) (2,two) (3,three) (4,four) (5,five)
    }
  }
}