KotlinLoops in Kotlin

Remarks

In Kotlin, loops are compiled down to optimized loops wherever possible. For example, if you iterate over a number range, the bytecode will be compiled down to a corresponding loop based on plain int values to avoid the overhead of object creation.

Repeat an action x times

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

Looping over iterables

You can loop over any iterable by using the standard for-loop:

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

Lots of things in Kotlin are iterable, like number ranges:

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

If you need an index while iterating:

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

There is also a functional approach to iterating included in the standard library, without apparent language constructs, using the forEach function:

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

it in this example implicitly holds the current element, see Lambda Functions

While Loops

While and do-while loops work like they do in other languages:

while(condition) {
    doSomething()
}

do {
    doSomething()
} while (condition)

In the do-while loop, the condition block has access to values and variables declared in the loop body.

Break and continue

Break and continue keywords work like they do in other languages.

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

If you have nested loops, you can label the loop statements and qualify the break and continue statements to specify which loop you want to continue or break:

[email protected] for(i in 0..10) {
    [email protected] for(j in 0..10) {
        break       // Will break the inner loop
        [email protected] // Will break the inner loop
        [email protected] // Will break the outer loop
    }
}

This approach won't work for the functional forEach construct, though.

Iterating over a Map in 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")
}

Recursion

Looping via recursion is also possible in Kotlin as in most programming languages.

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

println(factorial(10)) // 3628800

In the example above, the factorial function will be called repeatedly by itself until the given condition is met.

Functional constructs for iteration

The Kotlin Standard Library also provides numerous useful functions to iteratively work upon collections.

For example, the map function can be used to transform a list of items.

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

One of the many advantages of this style is it allows to chain operations in a similar fashion. Only a minor modification would be required if say, the list above were needed to be filtered for even numbers. The filter function can be used.

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