Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin延迟片阵列_Kotlin - Fatal编程技术网

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{…}
@marstran
ByteArray.take
也不是懒惰的,它创建了一个
ArrayList
for (bIdx in bufLimit - 1 downTo 0) {
    val b = buf[bIdx]
}