Sök…


Anmärkningar

I Kotlin sammanställs slingor till optimerade slingor där så är möjligt. Om du till exempel itererar över ett talintervall kommer bytekoden att kompileras ner till en motsvarande slinga baserad på vanliga int-värden för att undvika omkostnaderna för objektskapning.

Upprepa en åtgärd x gånger

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

Looping över iterables

Du kan slinga över alla iterable med standard för-loop:

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

Många saker i Kotlin är iterable, som antal intervall:

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

Om du behöver ett index medan du itererar:

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

Det finns också ett funktionellt tillvägagångssätt för iterering som ingår i standardbiblioteket, utan synliga språkkonstruktioner, med funktionen forEach:

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

it i detta exempel innehåller implicit det aktuella elementet, se Lambdafunktioner

Medan Loops

Loops medan och gör-medan fungerar som på andra språk:

while(condition) {
    doSomething()
}

do {
    doSomething()
} while (condition)

I do-while-slingan har tillståndsblocket tillgång till värden och variabler som deklareras i slingkroppen.

Bryt och fortsätt

Bryt och fortsätt sökord fungerar som på andra språk.

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
    }
}

Om du har kapslade öglor kan du märka slinganalyserna och kvalificera brott- och fortsättningsuppsättningarna för att ange vilken slinga du vill fortsätta eller bryta:

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
    }
}

Detta tillvägagångssätt fungerar dock inte för det funktionella för forEach konstruktion.

Iterating över en karta i Kotlin

//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")
}

Rekursion

Looping via rekursion är också möjligt i Kotlin som på de flesta programmeringsspråk.

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

println(factorial(10)) // 3628800

I exemplet ovan kommer factorial att kallas upp flera gånger av sig själv tills det givna villkoret är uppfyllt.

Funktionella konstruktioner för iteration

Kotlin Standard Library erbjuder också många användbara funktioner för att iterativt arbeta med samlingar.

Till exempel map kan funktionen användas för att omvandla en lista med objekt.

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

En av de många fördelarna med denna stil är att det gör det möjligt att kedja verksamheter på liknande sätt. Endast en mindre modifiering skulle krävas om säga, listan ovan behövde filtreras för jämna nummer. filter kan användas.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow