Kotlin序列连接
val seq1 = sequenceOf(1, 2, 3) val seq2 = sequenceOf(5, 6, 7) sequenceOf(seq1, seq2).flatten().forEach { ... }
这就是我正在做序列连接,但我担心它实际上是复制元素,而我所需要的是一个迭代器,它使用我给它的迭代器(seq1,seq2)中的元素。
有这样的function吗?
你的代码不会复制序列元素, sequenceOf(seq1, seq2).flatten()
实际上是你想要的:它产生一个序列,首先从seq1
项目,然后在seq1
完成时从seq2
。
另外,operator +
正是以这种方式实现的,所以你可以使用它:
(seq1 + seq2).forEach { ... }
运营商的来源如预期:
public operator fun Sequence .plus(elements: Sequence ): Sequence { 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
的不同方式实现,它复制元素。 在这里查找更多有关Iterable
和Sequence
之间的区别。