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) {} 
  • Kotlin, networkinguce el código duplicado
  • NoSuchMethodError utilizando Kotlin con el nuevo data binding de Android
  • Custom KeyDeserializer
  • ¿Por qué esta aplicación Spring Boot no puede encontrar la página principal?
  • NoSuchMethodError: no hay método estático beforeCheckcastToFunctionOfArity
  • Kotlin: Error en Maps
  • Android Kotlin Dagger2 proporciona gson: el parámetro especificado como no nulo es nulo
  • Excepción al analizar expresiones en AppDatabase
  • IntelliJ no reconoce el file kotlin después de eliminarlo y recrear con el mismo nombre
  • Dagger 2 Named no se puede proporcionar sin un método @Provides
  • Usando RxJava para get un resultado distinto con Realm y Retrofit