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()

posted @ 2025-08-02 14:59  刘宏缔的架构森林  阅读(10)  评论(0)    收藏  举报