Kotlin懒惰切片阵列

时间:2017-02-23 20:01:40

标签: kotlin

我需要向后迭代部分数组。我想这样做"功能上"因为它更容易理解,就像那样

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

sliceArrayreversedArray都不是懒惰的。是否有懒惰的版本或者我可能会回到

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

这更令人困惑和冗长?

1 个答案:

答案 0 :(得分:1)

如果使用列表而不是数组,则可以将其反转,然后转换为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)
}

as前缀的函数只包装对象而不复制,因此上面的代码不会复制buf内容。

请注意,如果您使用Array,则与ArrayList相比,不应失去任何效果。

然而,这个解决方案确实涉及多个迭代器,因此它的效率低于您在问题中建议的索引代码:

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