Kotlin: Idiomati c & Декларативный способ найти количество al oop без мутации - PullRequest
0 голосов
/ 22 января 2020

Как рассчитывать количество раз, когда al oop выполнялось с условием, например:

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

Но это требует временного счетчика и мутации. Есть ли лучший идиоматический c и декларативный способ без использования временных переменных и мутаций. Я мог бы придумать что-то вроде этого, но это выглядит так:

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

1 Ответ

1 голос
/ 22 января 2020

Стандартная библиотека 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-l oop и переменную counter на сайт вызова, как вы сделали в своем вопросе.

...