跳转到内容

Kotlin迭代器

来自代码酷

模板:Note

Kotlin迭代器[编辑 | 编辑源代码]

迭代器(Iterator)是Kotlin中用于遍历集合(如列表、集合、映射等)元素的一种机制。它提供了一种统一的方式来访问集合中的元素,而无需关心底层集合的具体实现。迭代器是Kotlin标准库的一部分,支持对集合的顺序访问和修改(如果集合是可变的)。

迭代器基础[编辑 | 编辑源代码]

Kotlin中的迭代器遵循以下核心原则:

  • 通过iterator()函数获取迭代器实例
  • 使用hasNext()检查是否还有元素可遍历
  • 使用next()获取下一个元素
  • 可变迭代器(MutableIterator)还支持remove()操作

基本迭代器示例[编辑 | 编辑源代码]

以下代码展示如何使用迭代器遍历一个列表:

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    val iterator = numbers.iterator()
    
    while (iterator.hasNext()) {
        println(iterator.next())
    }
}

输出:

one
two
three
four

迭代器类型[编辑 | 编辑源代码]

Kotlin提供了几种迭代器变体:

ListIterator[编辑 | 编辑源代码]

专为列表设计的迭代器,支持双向遍历:

fun main() {
    val numbers = listOf("one", "two", "three")
    val listIterator = numbers.listIterator()
    
    // 正向遍历
    while (listIterator.hasNext()) {
        println("正向: ${listIterator.next()}")
    }
    
    // 反向遍历
    while (listIterator.hasPrevious()) {
        println("反向: ${listIterator.previous()}")
    }
}

MutableIterator[编辑 | 编辑源代码]

允许在遍历时修改集合:

fun main() {
    val mutableNumbers = mutableListOf(1, 2, 3, 4)
    val mutableIterator = mutableNumbers.iterator()
    
    while (mutableIterator.hasNext()) {
        val item = mutableIterator.next()
        if (item % 2 == 0) {
            mutableIterator.remove() // 删除偶数
        }
    }
    
    println(mutableNumbers) // 输出: [1, 3]
}

迭代器的工作原理[编辑 | 编辑源代码]

迭代器内部维护一个"游标"来跟踪当前位置:

stateDiagram-v2 [*] --> 开始 开始 --> 有元素: hasNext() = true 有元素 --> 获取元素: next() 获取元素 --> 有元素 有元素 --> 结束: hasNext() = false 结束 --> [*]

数学上,迭代器可以表示为: I=(C,p,fnext,fhasNext) 其中:

  • C 是集合
  • p 是当前位置指针
  • fnext 是获取下一个元素的函数
  • fhasNext 是检查是否有下一个元素的函数

实际应用案例[编辑 | 编辑源代码]

案例1:文件行处理[编辑 | 编辑源代码]

迭代器非常适合处理大文件,可以逐行读取而不必加载整个文件到内存:

import java.io.File

fun processLargeFile(filename: String) {
    File(filename).useLines { lines ->
        val lineIterator = lines.iterator()
        while (lineIterator.hasNext()) {
            processLine(lineIterator.next())
        }
    }
}

fun processLine(line: String) {
    // 处理每一行的逻辑
    println(line.trim())
}

案例2:自定义迭代器[编辑 | 编辑源代码]

实现一个斐波那契数列迭代器:

class FibonacciIterator : Iterator<Int> {
    private var a = 0
    private var b = 1
    
    override fun hasNext() = true // 无限序列
    
    override fun next(): Int {
        val result = a
        a = b
        b += result
        return result
    }
}

fun main() {
    val fib = FibonacciIterator()
    repeat(10) {
        println(fib.next())
    }
}

输出:

0
1
1
2
3
5
8
13
21
34

迭代器的限制[编辑 | 编辑源代码]

  • 一次性:大多数迭代器只能遍历一次,再次遍历需要获取新的迭代器
  • 单向性:普通迭代器只能向前移动(ListIterator除外)
  • 并发修改:在迭代过程中修改集合(非通过迭代器自身)会导致ConcurrentModificationException

最佳实践[编辑 | 编辑源代码]

1. 优先使用Kotlin的for循环,它内部使用迭代器但语法更简洁 2. 处理大集合时考虑使用序列(Sequence)和迭代器组合 3. 需要并行处理时考虑使用并发集合和对应的安全迭代器 4. 实现自定义集合时,确保提供正确的迭代器实现

扩展知识[编辑 | 编辑源代码]

Kotlin还提供了forEachRemaining()方法,可以对剩余所有元素执行操作:

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    val iterator = numbers.iterator()
    
    // 跳过前两个元素
    iterator.next()
    iterator.next()
    
    // 处理剩余元素
    iterator.forEachRemaining { println(it * 2) }
}

输出:

6
8
10

模板:Tip