val seq1 = sequenceOf(1, 2, 3)
val seq2 = sequenceOf(5, 6, 7)
sequenceOf(seq1, seq2).flatten().forEach { ... }
Run Code Online (Sandbox Code Playgroud)
这就是我如何进行序列连接,但我担心它实际上是复制元素,而我只需要一个使用迭代器中的元素(seq1,seq2)的迭代器.
有这样的功能吗?
hot*_*key 34
您的代码不会复制序列元素,并且sequenceOf(seq1, seq2).flatten()实际上会执行您想要的操作:它会生成一个序列,该序列首先从中获取项目seq1,然后在seq1完成时从中获取seq2.
此外,运算符+以这种方式实现,因此您可以使用它:
(seq1 + seq2).forEach { ... }
Run Code Online (Sandbox Code Playgroud)
运营商的来源如预期:
public operator fun <T> Sequence<T>.plus(elements: Sequence<T>): Sequence<T> {
return sequenceOf(this, elements).flatten()
}
Run Code Online (Sandbox Code Playgroud)
您可以查看使用的stdlib的实现.flatten()FlatteningSequence,它实际上切换了原始序列的迭代器.实现可能会随着时间的推移而发生变化,但Sequence目的是尽可能地保持懒惰,因此您可以期望它以类似的方式运行.
例:
val a = generateSequence(0) { it + 1 }
val b = sequenceOf(1, 2, 3)
(a + b).take(3).forEach { println(it) }
Run Code Online (Sandbox Code Playgroud)
在这里,复制第一个序列永远不会成功,因为它是无限的,并且迭代(a + b)从一个接一个地获取项目a.
但请注意,它.flatten()以不同的方式实现Iterable,并且它会复制元素.详细了解这里Iterable和之间的差异.Sequence
您可能需要做的其他事情是创建一系列序列:
val xs = sequence {
yield(1)
yield(2)
}
val twoXs = sequence {
yieldAll(xs)
// ... interesting things here ...
yieldAll(xs)
}
Run Code Online (Sandbox Code Playgroud)
这不会做任何 xs + xs 不会做的事情,但它为您提供了一个地方可以做更复杂的事情。
| 归档时间: |
|
| 查看次数: |
7322 次 |
| 最近记录: |