Kotlin懒惰片数组
我需要向后迭代一个数组的一部分。 我想这样做“功能”,因为它更容易理解,就像那样
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
内容。
请注意,如果使用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) {}