[TOC]
前言
序列是kotlin 标准库提供的另外一种容器类型。使用 Swquence<T>
.主要是用来进行多步骤集合处理。
Sequence 对每个元素逐个执行所有处理步骤。避免中间步骤的结果,从而提高了整个集合处理链的性能,但是序列有延迟性质。建议在处理较小的集合或者进行简单计算时使用。
初始化
创建序列需要使用公共库的sequenceOf()函数。
示例:
fun main(string: Array<String>) {
//创建一个简单的序列
var sequen = sequenceOf("a", "b", "c", "d", "e")
// 也可以通过 list 或则Set 进行创建
val list = listOf("z", "x", "y")
var sequen1 = list.asSequence()
//函数 generateSequence() 创建无限序列
val oo = generateSequence(1) {
it + 2 //返回null时 序列停止生成, 当前模式没有返回 则序列无限。 it 是上一次的参数结果
}
//函数 generateSequence() 创建有限序列
val o1 = generateSequence(1) {
if (it + 2 < 10) it + 2 else null //创建有限序列
}
//使用 yield 创建序列
val oddNumbers = sequence {
yield(1) //返回一个序列 值
yieldAll(listOf(3, 5)) //返回多个序列值
yieldAll(generateSequence(7) { it + 2 }) //返回多个序列值
}
println(oddNumbers.take(10).toList())
}
//输出
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
操作
针对序列的操作可以分为两种类型:
- 无状态操作:不需要状态,并且可以独立处理每个元素,例如
map()
,filter()
。无状态操作还可能需要少量常数个状态来处理元素。例如take()
和drop()
- 有状态操作:需要大量状态, 通常与序列中元素的数量成比例。
如果序列操作,返回延迟生成一个另外序列,则该序列称为:中间序列。
否则就是末端操作,末端操作通常是使用toList()
或者sum()
。 只有通过末端操作才能检索序列元素。
序列可以多次迭代,但是某些序列实现可能会约束自己只能迭代一次。
示例:序列与列表对象的处理
fun main(string: Array<String>) {
//获取 前四个参数
val words = "The quick brown fox jumps over the lazy dog".split(" ")
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("获取前四个长度大于3的单词:${lengthsList}")
}
//输出
filter: The
filter: quick
filter: brown
filter: fox
filter: jumps
filter: over
filter: the
filter: lazy
filter: dog
length: 5
length: 5
length: 5
length: 4
length: 4
获取前四个长度大于3的单词:[5, 5, 5, 4]
可以看到运行逻辑是,执行完毕filter 然后再执行map。
整个处理逻辑是:
总共花费了23个步骤。
如果是序列:
示例:
fun main(string: Array<String>) {
//获取 前四个参数
val words = "The quick brown fox jumps over the lazy dog".split(" ").asSequence()
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("获取前四个长度大于3的单词:${lengthsList.toList()}")
}
//输出:
filter: The
filter: quick
length: 5
filter: brown
length: 5
filter: fox
filter: jumps
length: 5
filter: over
length: 4
获取前四个长度大于3的单词:[5, 5, 5, 4]
序列处理只需要 18 个步骤
序列是根据末端操作,进行处理的。所以序列可以是无限长度。
评论区