我想无限重复一个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] 删除。
我来说两句