Kotlin lazy slice array

Necesito iterar parte de una matriz al revés. Me gustaría hacer eso "funcionalmente", ya que es más comprensible, así

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

Pero tanto sliceArray como sliceArray no son flojos. ¿Hay una versión perezosa o debería recurrir a

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

que es mas confuso y detallado?

Si usa una list en lugar de una matriz, puede invertirla y luego convertirla en una 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) } 

Las funciones con el prefijo as solo envuelven objects sin copyr, por lo que el código anterior no copy el contenido buf .

Tenga en count que no debe perder ningún performance en comparación con Array si utiliza un ArrayList .

Sin embargo, esta solución implica varios iteradores, por lo que es algo less eficiente que el código de índice que ha sugerido en la pregunta:

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

Sugiero crear una function de extensión para manejar su caso de uso específico. p.ej:

 /** * 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]) } } 

Uso:

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