Kotlin序列连接

val seq1 = sequenceOf(1, 2, 3) val seq2 = sequenceOf(5, 6, 7) sequenceOf(seq1, seq2).flatten().forEach { ... } 

这就是我正在做序列连接,但我担心它实际上是复制元素,而我所需要的是一个迭代器,它使用我给它的迭代器(seq1,seq2)中的元素。

有这样的功能吗?

你的代码不会复制序列元素,而sequenceOf(seq1, seq2).flatten()实际上是你想要的:它会生成一个序列,从seq1 ,然后在seq1结束时从seq2

另外,operator +正是以这种方式实现的,所以你可以使用它:

 (seq1 + seq2).forEach { ... } 

运营商的来源如预期:

 public operator fun <T> Sequence<T>.plus(elements: Sequence<T>): Sequence<T> { return sequenceOf(this, elements).flatten() } 

你可以看一下stdlib中使用FlatteningSequence.flatten()的实现 ,它实际上会切换原始序列的迭代器。 实现可以随着时间的推移而改变,但是Sequence的目的是尽可能的懒,所以你可以期望它的行为类似。

例:

 val a = generateSequence(0) { it + 1 } val b = sequenceOf(1, 2, 3) (a + b).take(3).forEach { println(it) } 

在这里,复制第一个序列永远不会成功,因为它是无限的,并且迭代(a + b)a逐个获取项目。


但是请注意, .flatten()Iterable的不同方式实现,它复制元素。 在这里查找更多有关IterableSequence之间的区别。