kotlin: sequence的使用
一,代码:
函数:
//得到sequence
fun getSequence() = sequence {
println("添加 1")
yield(1)
println("添加 2")
yield(2)
println("添加 3")
yield(3)
println("添加 4")
yield(4)
}
//打印sequence
fun printSequence(sequence: Sequence<Int>) {
val iterator = sequence.iterator()
val i = iterator.next()
println("读取:$i")
val j = iterator.next()
println("读取:$j")
val k = iterator.next()
println("读取:$k")
val m = iterator.next()
println("读取:$m")
}
//打印sequence
fun printSequence2(sequence: Sequence<Int>) {
sequence.forEach {
println("forEach读取 -> $it")
}
}
调用:
binding.button1.setOnClickListener {
runBlocking {
val sequence = getSequence()
printSequence2(sequence)
}
}
说明:
sequence( )函数: 可以逐个或按任意大小的组块生成序列元素.
此函数的参数采用一个lambda 表达式,其中包含 yield() 与 yieldAll() 函数的调用。
它们将一个元素返回给序列使用者,并暂停 sequence() 的执行,直到使用者请求下一个元素。
yield() 使用单个元素作为参 数;
yieldAll() 中可以采用 Iterable 对象、Iterable 或其他 Sequence 。
yieldAll() 的Sequence 参数可以是无限的。
1,普通程序在被调用以后,只会在末尾的地方返回,并且只会返回一次;
而协程则不受此限制,协程的代码可以在任意 yield 的地方挂起(Suspend)让出执行权,然后等到合适的时机再恢复(Resume)。
在这个情况下,yield 是代表了“让步”的意思。
2,普通程序需要一次性收集完所有的值,然后统一返回;
而协程则可以每次只返回(yield)一个值,比如我们前面写的 getSequence() 方法。
在这个情况下,yield 既有“让步”的意思,也有“产出”的意思。
它不仅能让出执行权,还同时产生一个值,比如前面的 yield(1),就代表产出的值为 1。
二,测试效果:
调用printSequence()
调用printSequence2()