Skip to content

序列

1. 什么是序列

在kotlin中, 序列(Sequence) 是一个支持 惰性计算 的集合类型,类似于java的Stream API。序列的主要特点是,它会延迟计算,只在有需要的时候才执行计算,这使得其特别适合处理大型集合或者链式调用中的中间操作。

序列的特点:

  • 序列是一种可以通过迭代来获取元素的集合类型,它与集合(ListSet)的最大区别在于惰性计算。
  • 在常规集合操作中,像map、filter这样的中间操作会立即应用在整个集合上,并返回一个新的集合。而在序列中,中间操作会延迟,知道最终操作(如 toList()first() 调用时才会真正执行

2. 序列的优点

  1. 性能优化:序列通过惰性计算减少了不必要的中间结果计算,尤其适合大型集合。
  2. 链式操作:可以进行多次中间操作而不立即创建新的集合,最终计算结果时才进行全部操作。
  3. 减少内存消耗:由于惰性计算不会生成中间结果,序列在处理大数据集时能够更高效使用内存。

3. 如何创建序列

3.1 使用 sequenceOf()

kotlin
val sequence = sequenceOf(1, 2, 3, 4, 5)

3.2 从集合转换为序列

kotlin
val list = listof(1, 2, 3, 4, 5)
val sequence = list.asSequence()

3.3 使用 generateSequence()

generateSequence() 可以生成一个无限序列。

kotlin
val infiniteSequence = generateSequence(1){it + 1}
// 这个序列会从1开始,不断增加

4. 序列的操作

序列提供了两种操作类型:

  1. 中间操作:返回一个新的序列,并且是惰性的(如 mapfilter等)。不会立即执行。
  2. 终端操作:触发整个序列的计算,并返回结果(如 toListfirst等)。
kotlin
val sequence = listOf(1, 2, 3, 4, 5).asSequence()
val result = sequence
    .map { println("Mapping $it"); it * 2 }
    .filter { println("Filtering $it"); it % 3 == 0 }
    .toList()  // 触发计算
println(result)  // 输出 [6]

// 输出结果
// Mapping 1
// Mapping 2
// Mapping 3
// Filtering 6
// Mapping 4
// Mapping 5

5. 注意事项

  1. 序列不是万能的:对于小型集合,序列可能引入额外的开销,因为它的惰性计算机制需要维护迭代状态。对于小集合,直接使用集合操作可能更高效。
  2. 终端操作会触发计算:一定要记住,序列的中间操作是惰性的,只有终端操作(如 toList、first 等)才会触发整个计算链。

Released under the MIT License.