Kotlin学習ノート(1):ラベル

2904 ワード

ラベルの宣言方法:ラベル名++「@」、例えばabc@ラベルの参照方法:「@」++ラベル名、例えば:@abc
Kotlinのラベルの意味はJavaの基本と一致しており、指定された位置にジャンプしやすいようにbreakやcontinueと組み合わせてよく使われています.しかし、Kotlinのラベルはreturnと組み合わせて使用することもでき、ラベルで返すことを示します.
BreakとContinue
例を次に示します.
fun main(args: Array) {
    for (i in 1..4) {
        for (j in 1..4) {
            if (i == 2 && j == 2) {
                break
            }
            println("i = $i, j = $j")
        }
    }
}

以上のコード表現のbreakは、内層サイクルから飛び出しただけであり、すなわち、i=2,j=2のときに内層サイクルを終了し、iに1を加えてサイクルを継続する.印刷結果は次のとおりです.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 1, j = 4
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3
i = 3, j = 4
i = 4, j = 1
i = 4, j = 2
i = 4, j = 3
i = 4, j = 4

i=2,j=2で外層ループから直接飛び出したい場合は、ラベルを使用します.コードは次のとおりです.
fun main(args: Array) {
    loop@ for (i in 1..4) {
        for (j in 1..4) {
            if (i == 2 && j == 2) {
                break@loop
            }
            println("i = $i, j = $j")
        }
    }
}

外側ループにラベルloop@を宣言し、breakが必要な場合はbreak@loopを直接使用すると、外側ループから飛び出すことができます.実行結果は次のとおりです.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 1, j = 4
i = 2, j = 1

上のコードは次のJavaコードに等価です.
    public static void main(String[] args) {
        loop: for (int i = 1; i <= 4; i++) {
            for (int j = 1; j <= 4; j++) {
                if (i == 2 && j == 2) {
                    break loop;
                }
                System.out.println("i = " + i + ", j = " + j);
            }
        }
    }

continueラベルの使用方法はbreakと同様であり,後述しない.
ラベルで返す
例を次に示します.
fun main(args: Array) {
    val ints = intArrayOf(1, 2, 3, 0, 4, 5, 6)
    ints.forEach {
        if (it == 0) return
        print(it)
    }
}

上のコードのreturnは、main関数が最も直接囲まれた関数であるため、main関数から返されることを意味します.実行結果は次のとおりです.
123

forEachのlambda式から返すにはラベルが必要です.コードは、lambda式の前にラベルlit@を宣言し、returnでラベル、すなわちreturn@litを使用します.
val ints = intArrayOf(1, 2, 3, 0, 4, 5, 6)
ints.forEach lit@ {
    if (it == 0) return@lit
    print(it)
}

実行結果:
123456

この方法に加えて、暗黙的なラベルを使用することもできます.このラベルはlambda式を受け入れる関数と同じ名前で、前の例ではforEachです.次のようになります.
val ints = intArrayOf(1, 2, 3, 0, 4, 5, 6)
ints.forEach {
    if (it == 0) return@forEach
    print(it)
}

ラベルを使用しない場合は、lambda式の代わりに匿名関数を使用して上記の機能を実現することもできます.コードは次のとおりです.匿名関数内部のreturn文は、匿名関数自体から返されますが、lambda式コードを使用するよりも明確で簡潔です.
val ints = intArrayOf(1, 2, 3, 0, 4, 5, 6)
ints.forEach(fun(value: Int) {
    if (value == 0) return
    print(value)
})

参考資料:http://kotlinlang.org/docs/reference/returns.html