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
的不同方式实现,它复制元素。 在这里查找更多有关Iterable
和Sequence
之间的区别。