我需要向后迭代数组的一部分。我想“按功能”执行此操作,因为它更容易理解,例如
for (b in buf.sliceArray(0 until bufLimit).reversedArray()) {}
但是
sliceArray
和reversedArray
都不是懒惰的。有一个懒惰的版本,还是我应该退回到for (bIdx in bufLimit - 1 downTo 0) {
val b = buf[bIdx]
}
哪个更令人困惑和冗长?
最佳答案
如果使用列表而不是数组,则可以将其反转,然后转换为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]
}