Kotlin:在没有突变的情况下找到循环计数的惯用和声明方式

Kotlin: Idiomatic & Declarative way to find count of a loop without mutation

如何计算 no.of 次循环有 运行 的条件,例如:

var count = 0
while (stk.isNotEmpty()) {
  stack.pop()
  count++
}

但这涉及临时计数器和突变。在不使用任何临时变量和突变的情况下,是否有更好的惯用和声明方式。我可以想出这样的东西,但它确实感觉很老套:

val count = stk.takeWhile { stk.isNotEmpty() }.also { stk.pop() }.count()

Kotlin 标准库不提供您正在寻找的内容,但您可以创建自己正在搜索的内容:

fun repeatWhile(condition: () -> Boolean, action: () -> Unit): Int {
    var count = 0
    while (condition()) {
        action()
        count++
    }
    return count
}

并像这样使用它:

val stack = Stack<Int>()
stack.push(1)
stack.push(2)
stack.push(3)

val count = repeatWhile({ stack.isNotEmpty() }) {
    stack.pop()
}

println(count) // 3

就我个人而言,我认为这并不比将 while 循环和计数器变量暴露给调用站点更好,就像您在问题中所做的那样。