Kotlin ленивый срез

Мне нужно повторить часть массива назад. Я бы хотел сделать это «функционально», поскольку это более понятно,

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

Но и sliceArray и sliceArray не ленивы. Есть ли ленивый вариант, или я, вероятно, должен вернуться к

 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) } 

Функции с префиксом только обертывают объекты без копирования, поэтому приведенный выше код не копирует содержимое buf .

Обратите внимание, что вы не должны потерять какую-либо производительность по сравнению с Array если используете ArrayList .

Однако это решение включает несколько итераторов, поэтому оно несколько менее эффективно, чем индексный код, который вы предложили в вопросе:

 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) {}