我需要向后迭代数组的一部分。我想“按功能”执行此操作,因为它更容易理解,例如

for (b in buf.sliceArray(0 until bufLimit).reversedArray()) {}

但是sliceArrayreversedArray都不是懒惰的。有一个懒惰的版本,还是我应该退回到
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]
}

09-12 01:18