Kotlin懒惰片数组

我需要向后迭代一个数组的一部分。 我想这样做“功能”,因为它更容易理解,就像那样

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内容。

请注意,如果使用ArrayList则与Array相比,不应该失去任何性能。

但是这个解决方案确实涉及到多个迭代器,所以它比你在这个问题中提出的索引代码效率要低一些:

 for (bIdx in bufLimit - 1 downTo 0) { val b = buf[bIdx] } 

我建议创建一个扩展函数来处理你的具体用例。 例如:

 /** * Performs the given [action] on each element at the specified [indices]. */ inline fun ByteArray.forEachAt(indices: Iterable<Int>, action: (Byte) -> Unit): Unit { indices.forEach { index -> action(this[index]) } } 

用法:

 buf.forEachAt((0 until bufLimit).reversed)) {} // or buf.forEachAt(bufLimit - 1 downTo 0) {}