Kotlin延迟片阵列
我需要向后迭代数组的一部分。我想“从功能上”这样做,因为这样更容易理解Kotlin延迟片阵列,kotlin,Kotlin,我需要向后迭代数组的一部分。我想“从功能上”这样做,因为这样更容易理解 for (b in buf.sliceArray(0 until bufLimit).reversedArray()) {} 但是sliceArray和reversedArray都不是懒惰的。是否有一个懒惰的版本,或者我应该回到过去 for (bIdx in bufLimit - 1 downTo 0) { val b = buf[bIdx] } 哪个更容易混淆和冗长?我建议创建一个扩展函数来处理您的特定用例。e
for (b in buf.sliceArray(0 until bufLimit).reversedArray()) {}
但是sliceArray
和reversedArray
都不是懒惰的。是否有一个懒惰的版本,或者我应该回到过去
for (bIdx in bufLimit - 1 downTo 0) {
val b = buf[bIdx]
}
哪个更容易混淆和冗长?我建议创建一个扩展函数来处理您的特定用例。e、 g:
/**
* 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]) }
}
如果使用列表而不是数组,则可以将其反转,然后转换为
序列
:
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]
}
这个怎么样
buf.take(bufLimit).reversed().forEach{…}
@marstranByteArray.take
也不是懒惰的,它创建了一个ArrayList
for (bIdx in bufLimit - 1 downTo 0) {
val b = buf[bIdx]
}