我编写了以下代码,似乎可以正常工作
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
?
答案 0 :(得分:0)
基本上序列不是迭代器,它更像是Iterable。
它甚至内部有iterator()
方法,可以用多种方式定义 - 在每次调用时返回一个迭代器或新实例。