Поиск…


замечания

В Котлине петли собираются вплоть до оптимизированных петель, где это возможно. Например, если вы перебираете диапазон чисел, байт-код будет скомпилирован до соответствующего цикла на основе простых значений int, чтобы избежать накладных расходов на создание объекта.

Повторить действие x раз

repeat(10) { i ->
    println("This line will be printed 10 times")
    println("We are on the ${i + 1}. loop iteration")
}

Пересечение повторяющихся объектов

Вы можете циклически перебирать любые итерации с помощью стандартного цикла for:

val list = listOf("Hello", "World", "!")
for(str in list) {
    print(str)
}

В Котлине много вещей, таких как числовые диапазоны:

for(i in 0..9) {
    print(i)
}

Если вам нужен индекс во время итерации:

for((index, element) in iterable.withIndex()) {
    print("$element at index $index")
}

Существует также функциональный подход к итерации, включенный в стандартную библиотеку, без видимых языковых конструкций, с использованием функции forEach:

iterable.forEach {
    print(it.toString())
}

it в этом примере неявно удерживает текущий элемент, см. Лямбда-функции

В то время как петли

В то время как циклы do-while работают так же, как на других языках:

while(condition) {
    doSomething()
}

do {
    doSomething()
} while (condition)

В цикле do-while блок условий имеет доступ к значениям и переменным, объявленным в теле цикла.

Перерыв и продолжение

Перерыв и продолжение ключевых слов работают так же, как на других языках.

while(true) {
    if(condition1) {
        continue // Will immediately start the next iteration, without executing the rest of the loop body
    }
    if(condition2) {
        break // Will exit the loop completely
    }
}

Если у вас есть вложенные циклы, вы можете пометить операторы цикла и квалифицировать инструкции break и continue, чтобы указать, какой цикл вы хотите продолжить или разбить:

outer@ for(i in 0..10) {
    inner@ for(j in 0..10) {
        break       // Will break the inner loop
        break@inner // Will break the inner loop
        break@outer // Will break the outer loop
    }
}

Однако этот подход не будет работать для функциональной для forEach конструкции.

Итерация по карте в Котлине

//iterates over a map, getting the key and value at once

var map = hashMapOf(1 to "foo", 2 to "bar", 3 to "baz")

for ((key, value) in map) {
    println("Map[$key] = $value")
}

Рекурсия

Циклирование через рекурсию также возможно в Котлине, как и в большинстве языков программирования.

fun factorial(n: Long): Long = if (n == 0) 1 else n * factorial(n - 1)

println(factorial(10)) // 3628800

В приведенном выше примере factorial функция будет вызываться повторно сама по себе до тех пор, пока не будет выполнено заданное условие.

Функциональные конструкции для итерации

Стандартная библиотека Kotlin также предоставляет множество полезных функций для итеративной работы над коллекциями.

Например, функция map может использоваться для преобразования списка элементов.

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
val numberStrings = numbers.map { "Number $it" }

Одним из многих преимуществ этого стиля является то, что он позволяет осуществлять операции в цепочке аналогичным образом. Может потребоваться только незначительная модификация, если, скажем, список, указанный выше, необходимо отфильтровать для четных чисел. Можно использовать функцию filter .

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
val numberStrings = numbers.filter { it % 2 == 0 }.map { "Number $it" }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow