Instrukcje sterujące

Kotlin

  |   6 min czytania
(Kotlin v1.3)

Instrukcje if-else

Instrukcja warunkowa if jest wyrażaniem - zwraca wartość logiczną. Blok instrukcji warunowych if, else if, else działa podobnie jak w Java. Jeśli blok operacji dla spełnionenego (lub nie) warunku zawiera się w jednej linii wówczas klamry są opcjonalne.

var a = 1
var b = 2
var c = 0

//standard way
if(a < b) 
    c = a
else if(a > b) 
    c = b
else {
    //do something
    c = a + b
}

//as expression
c = if(a < b) a 
    else if(a > b) b 
    else { //else branch is required when if is using as expression
        //do something
        a+b //note that last expression must be returning value
    }

Wyrażenie range

Wyrażania zakresu służą do sprawdzania czy dana wartość znajduje się w przedziale wartości, a także mogą pełnić rolę iteratora dla zmiennej na zadanym przedziale. Wyrażenia zakresu są zdefiniowane dla typów Comparable, natomiast typy proste (takie jak Int, Long, Char) posiadają zoptymalizowaną implementacje.

var a = 3
if(a in 1..5) print("a is in 1-5 range") //1<=a && a<=5
if(a !in 0..9) print("a is not a single number") //0>a || a>9

Operator when

W Kotlin operator when jest tym samym czym switch w Java - dopasowuje on argument (w sposób sekwencyjny) do gałęzi warunków dopóki nie jeden z warunków zostanie spełniony. Podobnie jak instrukcje if-else może zostać użyty w formie wyrażenia.

var a = 3
when(a) {
    1, 2, 3 -> print("a is in small range")
    in 4..10 -> print("a is in big range")
    0 -> print("a is zero")
    else -> { 
        print("a is not in range")
    }
}

Pętla for

Iteruje po elementach instancji klas, które dostarczają implementacji Iterator. Działanie pętli jest odpowiednikiem pętli for-each z Java.

var array = ArrayOf(1, 2, 3)
for(item: Int in array) {
    print(item)
}

//or just
for(item in array) print(item)

//or iterate by indices
for(i in array.indices) print(array[i])

Iteracja w pętli for może odbywać się także przy wykorzystaniu wyrażenia range.

for(i in 1..3) print(i) //1,2,3
for(i in 1 until 3) print(i) //1,2,3
for(i in 5..3) print(i) //5,4,3
for(i in 5 downTo 3) print(i) //5,4,3
for(i in 1..10 step 2) print(i) //1,3,5,7,9

Pętla while

Działanie i konstrukcja pętli while oraz do..while przypomina tą znaną z Java. Obie pętle wykonują się tak długo dopóki warunek jest spełniony. Programista sam musi zadbać o zwiększanie się iteratora lub zmianę wartości logicznej warunku. W przypadku pętli do-while jest gwarancja wykonania instrukcji przynajmniej raz.

var i = 1
while(i <= 5) {
    print(i)
    i++
}

var j = 0
do {
    print(j)
    j++
} while(j < 0)

Instrukcje skoku

Kotlin podobnie jak większość języków dostarcza standardowych instrukcji wyjścia: break (wychodzi z ciała bieżącej pętli lub warunku) oraz continue (wychodzi z bieżącego kroku bieżącej pętli lub warunku).

var a = 9
for(i in 1..10) {
    if(i == a) break
    if(i % 2 == 0) continue
    print(i)
}

Instrukcje skoku mogą zostać użyte wraz z etykietą pętli do której się odnoszą.

loop@ for(i in 1..10) {
    for(j in 1..10) {
        if (i*j % 2 == 0) continue@loop
        print(" " + i*j)
    }
}

Instrukcja return zwracająca wartość funkcji może współpracować z etykietami dzięki czemu znajduje zastosowanie jak innstrukcja wyjścia w funkcjach i przede wszystkim wyrażeniach lambda.

listOf(1, 2, 3, 4, 5).forEach {
    if(it %2 == 0) return // non-local return directly to the caller of foo()
    print(" " + it)
}
//returned from entire caller function body so this point is unreachable

listOf(1, 2, 3, 4, 5).forEach loop@{
    if(it %2 == 0) return@loop 
    print(" " + it)
}
//returned only from the local caller - foreach loop, not from caller function so this point is reachable