首页 > 解决方案 > Kotlin:查找没有突变的循环计数的惯用和声明式方法

问题描述

如何计算循环在条件下运行的次数,例如:

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

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

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

标签: kotlinfunctional-programmingdeclarative

解决方案


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 循环和计数器变量暴露给调用站点更好,就像您在问题中所做的那样。


推荐阅读