我需要向后迭代部分数组。我想这样做"功能上"因为它更容易理解,就像那样
for (b in buf.sliceArray(0 until bufLimit).reversedArray()) {}
但sliceArray
和reversedArray
都不是懒惰的。是否有懒惰的版本或者我可能会回到
for (bIdx in bufLimit - 1 downTo 0) {
val b = buf[bIdx]
}
这更令人困惑和冗长?
答案 0 :(得分:1)
如果使用列表而不是数组,则可以将其反转,然后转换为Sequence
:
val buf: List = listOf(1, 2, 3, 4, 5)
val bufLimit = 3
for (b in buf.asReversed().asSequence().drop(buf.size - bufLimit)) {
println(b)
}
as
前缀的函数只包装对象而不复制,因此上面的代码不会复制buf
内容。
请注意,如果您使用Array
,则与ArrayList
相比,不应失去任何效果。
然而,这个解决方案确实涉及多个迭代器,因此它的效率低于您在问题中建议的索引代码:
for (bIdx in bufLimit - 1 downTo 0) {
val b = buf[bIdx]
}