gpt4 book ai didi

Kotlin 序列连接

转载 作者:IT老高 更新时间:2023-10-28 13:28:46 26 4
gpt4 key购买 nike

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

另外,操作符+就是这样实现的,所以你可以直接使用:

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

算子的来源如预期:

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

你可以看看implementation of .flatten() in stdlib使用 FlatteningSequence ,它实际上切换了原始序列的迭代器。实现可能会随着时间而改变,但 Sequence 旨在尽可能地懒惰,因此您可以期望它以类似的方式运行。

例子:

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

(a + b).take(3).forEach { println(it) }

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


但是请注意,对于 Iterable.flatten() 以不同的方式实现,它 does复制元素。详细了解 IterableSequence 之间的区别 here .

关于Kotlin 序列连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40161956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com