序列如何在Kotlin重新进入时恢复状态?

时间:2018-03-10 18:54:32

标签: collections kotlin sequence

我编写了以下代码,似乎可以正常工作

import kotlin.coroutines.experimental.buildSequence

fun concatElemSeq(elem : String, seq : Sequence<String>) = buildSequence {
    seq.forEach { yield(elem+it) }
}

fun concatSeqSeq( seq1 : Sequence<String>, seq2 : Sequence<String> ) = buildSequence {
    seq1.forEach { yieldAll(concatElemSeq(it, seq2)) }
}

fun main(args: Array<String>) {

    val seq = buildSequence {
        val l = listOf("A", "B", "C")
        l.forEach { yield(it) }
    }

    concatSeqSeq(seq, seq).forEach { println(it) }

}

只创建了seq的一个实例,即将其传递给函数,我在调试器中检查过。然而,代码产生了字符的所有组合,这意味着它在不同位置具有该序列的副本。

这怎么可能?

更新

我尝试使用Iterator进行同样的操作,但它没有用。如何区分Sequence这样的类,它们恢复了自己的状态,这些类是Iterator这样的类,哪些不是?

如何编写我自己的类,它会在重新进入时恢复状态,如Sequence

1 个答案:

答案 0 :(得分:0)

基本上序列不是迭代器,它更像是Iterable。 它甚至内部有iterator()方法,可以用多种方式定义 - 在每次调用时返回一个迭代器或新实例。