如何在Kotlin中无限重复序列?

埃里克

我想无限重复一个T元素Sequence<T>使用kotlin.collections.asSequence无法完成此操作例如:

val intArray = intArrayOf(1, 2, 3)
val finiteIntSequence = intArray.asSequence()
val many = 10
finiteIntSequence.take(many).forEach(::print)
// 123

这不是我想要的。我期望kotlin.collections.repeat存在某种功能,但是不存在,所以我自己实现了一个功能(例如,为此IntArray):

var i = 0
val infiniteIntSequence = generateSequence { intArray[i++ % intArray.size] }
infiniteIntSequence.take(many).forEach(::print)
// 1231231231

这是非常必要的,因此我认为必须有一种更实用,更省力的方法来执行此操作。如果存在,那么Kotlin在有限次数内重复收集(/)数组/数组的标准方法是什么?

塞勒姆

更新:从Kotlin 1.3开始,协程不再具有实验性!随意使用它们:)


如果您允许使用协程,则可以使用sequence以下方法以一种非常简洁的方式进行操作

无限次

fun <T> Sequence<T>.repeat() = sequence { while (true) yieldAll(this@repeat) }

注意使用合格的this表达式 this@repeat-简单地使用this会引用lambda的接收者a SequenceScope

那你就可以

val intArray = intArrayOf(1, 2, 3)
val finiteIntSequence = intArray.asSequence()
val infiniteIntSequence = finiteIntSequence.repeat()

println(infiniteIntSequence.take(10).toList())
// ^ [1, 2, 3, 1, 2, 3, 1, 2, 3, 1]

有限的时间

fun <T> Sequence<T>.repeat(n: Int) = sequence { repeat(n) { yieldAll(this@repeat) } }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章