Kotlin ループ制御

For ループ

For ループは、イテレータ(iterator)を提供する任意のオブジェクトによってトラバースできます。構文は次の通りです。

for (item in collection) print(item)

ループはコードブロックにすることができます。

for (item: Int in ints) {
    // ……
}

forはループでイテレータを提供するオブジェクトをトラバースできます。

配列または listをトラバースしたい場合は、次のコードを実行してください。

for (i in array.indices) {
    print(array[i])
}

このような「間隔でトラバース」は、追加のオブジェクトを作成せずに最適化された実装にコンパイルされます。

または、 withIndexライブラリ関数を使用します。

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

実例

集合をループする

fun main(args: Array<String>) {
    val items = listOf("apple", "banana", "kiwi")
    for (item in items) {
        println(item)
    }

    for (index in items.indices) {
        println("item at $index is ${items[index]}")
    }
}

結果:

apple
banana
kiwi
item at 0 is apple
item at 1 is banana
item at 2 is kiwi

whileとdo…whileループ

while最も基本的なループで、構文は次の通りです。

while( ブール式 ) {
  //ループする内容
}

do…while ループがwhileステートメントに対して、条件を満たさない場合は、ループを実行できません。しかし、ある場合には、条件を満たしていなくても少なくとも1回する必要があります。

do…whileループとwhileループが似ていますが、異なるのは、do…whileループは少なくとも1回実行されます。

do {
       //コードとステートメント
}while(ブール式);

実例

fun main(args: Array<String>) {
    println("----while を使用する-----")
    var x = 5
    while (x > 0) {
        println( x--)
    }
    println("----do...while を使用する-----")
    var y = 5
    do {
        println(y--)
    } while(y>0)
}

結果:

----while を使用する-----
5
4
3
2
1
----do...while を使用する-----
5
4
3
2
1

returnとジャンプ

Kotlinには3つの構造化ジャンプ式があります。

  • Return。 デフォルトで、一番近いクロージャ(関数閉包)または無名関数から返されます。
  • break。 一番近い外側のループを終了します。
  • Continue。 一番近い外側のループを続きます。

このループでは、Kotlinは従来のbreakとcontinueをサポートしています。

fun main(args: Array<String>) {
    for (i in 1..10) {
        if (i==3) continue  // i は3の場合には現在のループをスキップし、次のループを続けます。
        println(i)
        if (i>5) break   // i は6の場合にはループを終了します。
    }
}

結果:

1
2
4
5
6

Break と Continueラベル

Kotlinにある任意の式はラベル(label)でマークできます。 ラベルのフォーマットは識別子の後ろに@記号を付きます。例えば、abc@、fooBar@は有効なラベルです。 式のラベルを追加する場合には、その前にタグを追加するだけでいいです。

loop@ for (i in 1..100) {
    // ……
}

今、ラベルでbreakまたはcontinueを制御できます。

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (……) break@loop
    }
}

ラベルから制御された break は、このラベルで指定されたループの後ろの実行ポイントにジャンプします。continueはラベルで指定された次回のループを実行します。

ラベルに返します

Kotlinは関数リテラル、ローカル変数、オブジェクト式を持っています。そのため、Kotlinの関数はネストされることができます。ラベルに制御された returnは外側の関数から返すことができます。最も重要な用途は、lambda式から返すことです。次には例を挙げます。

fun foo() {
    ints.forEach {
        if (it == 0) return
        print(it)
    }
}

この return式は一番近いクロージャ(関数閉包)(foo )から返します。 (この非ローカルのreturnは、インライン関数のLambda式のみに渡すことをサポートしています。)Lambda式から返す必要がある場合は、returnを制御するためにタグを追加する必要があります。

fun foo() {
    ints.forEach lit@ {
        if (it == 0) return@lit
        print(it)
    }
}

今、それは lambda式から返すだけです。通常、暗黙のラベルを使用することはより便利です。 このラベルは、lambdaを受け入れる関数と同じ名前です。

fun foo() {
    ints.forEach {
        if (it == 0) return@forEach
        print(it)
    }
}

あるいは、無名関数を使用して、lambda式を置き換えます。 無名関数内のreturnステートメントは、無名関数自体から返します

fun foo() {
    ints.forEach(fun(value: Int) {
        if (value == 0) return
        print(value)
    })
}

return値を返す場合、パーサーはラベルに制御されたreturnを優先的に選択します。

return@a 1

「ラベルでマークされた式 (@a 1)を返すことではなく、ラベルの@aから1を返します」ということを意味します。

Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です