Kotlinリターン、ブレーク、続行キーワード
1. 概要
このチュートリアルでは、Kotlinでの構造ジャンプ式の使用法について説明します。
簡単に言うと、 Kotlinには、return、break、continueの3つの構造的なジャンプ式があります。次のセクションでは、ラベルがある場合とない場合の機能について説明します。
2. Kotlinのラベル
Kotlinの式には、ラベルを付けることができます。
識別子の後に「@」記号を付けてラベルを作成します。たとえば、 abc @ 、 loop@は有効なラベルです。
式にラベルを付けるには、式の前にラベルを追加するだけです。
loop@ for (i in 1..10) {
// some code
}
3. Breakステートメント
ラベルがない場合、breakは最も近い囲みループを終了します。
例を見てみましょう:
@Test
fun givenLoop_whenBreak_thenComplete() {
var value = ""
for (i in "hello_world") {
if (i == '_') break
value += i.toString()
}
assertEquals("hello", value)
}
または、ラベルで breakを使用して、そのラベルでマークされたループを終了することもできます:
@Test
fun givenLoop_whenBreakWithLabel_thenComplete() {
var value = ""
outer_loop@ for (i in 'a'..'d') {
for (j in 1..3) {
value += "" + i + j
if (i == 'b' && j == 1)
break@outer_loop
}
}
assertEquals("a1a2a3b1", value)
}
この場合、i変数とj変数がそれぞれ「b」と「1」に等しいときに、外側のループが終了します。
4. 続行ステートメント
次に、 continue キーワードを見てみましょう。これは、ラベルの有無にかかわらず使用できます。
ラベルがない場合、continueは囲んでいるループの次の反復に進みます。
@Test
fun givenLoop_whenContinue_thenComplete() {
var result = ""
for (i in "hello_world") {
if (i == '_') continue
result += i
}
assertEquals("helloworld", result)
}
一方、ループをマークするラベルを付けて続行を使用すると、そのループの次の反復に進みます:
@Test
fun givenLoop_whenContinueWithLabel_thenComplete() {
var result = ""
outer_loop@ for (i in 'a'..'c') {
for (j in 1..3) {
if (i == 'b') continue@outer_loop
result += "" + i + j
}
}
assertEquals("a1a2a3c1c2c3", result)
}
この例では、 continue を使用して、outer_loop。というラベルの付いたループの1回の反復をスキップしました。
5. Returnステートメント
ラベルがない場合、最も近い囲み関数または無名関数に戻ります:
@Test
fun givenLambda_whenReturn_thenComplete() {
var result = returnInLambda();
assertEquals("hello", result)
}
private fun returnInLambda(): String {
var result = ""
"hello_world".forEach {
if (it == '_') return result
result += it.toString()
}
//this line won't be reached
return result;
}
Return は、匿名 関数に続行ロジックを適用する場合にも役立ちます:
@Test
fun givenAnonymousFunction_return_thenComplete() {
var result = ""
"hello_world".forEach(fun(element) {
if (element == '_') return
result += element.toString()
})
assertEquals("helloworld", result)
}
この例では、 return ステートメントは、匿名の楽しみの呼び出し元に戻ります。 forEachループ。
ラムダ式の場合、というラベルの付いたreturnを使用して、同様の結果を得ることができます。
@Test
fun givenLambda_whenReturnWithExplicitLabel_thenComplete() {
var result = ""
"hello_world".forEach lit@{
if (it == '_') {
return@lit
}
result += it.toString()
}
assertEquals("helloworld", result)
}
または、暗黙のラベルを使用してreturnすることもできます。
@Test
fun givenLambda_whenReturnWithImplicitLabel_thenComplete() {
var result = ""
"hello_world".forEach {
if (it == '_') {
// local return to the caller of the lambda, i.e. the forEach loop
return@forEach
}
result += it.toString()
}
assertEquals("helloworld", result)
}
上記の例では、returnステートメントはラムダの呼び出し元であるforEachループにも戻ります。
最後に、 returnをラベルとともに使用してラムダ式にブレークロジックを適用することができます外部のラベルに戻る:
@Test
fun givenAnonymousFunction_returnToLabel_thenComplete() {
var result = ""
run loop@{
"hello_world".forEach {
if (it == '_') return@loop
result += it.toString()
}
}
assertEquals("hello", result)
}
6. 結論
この記事では、Kotlinでの return、break、continueのユースケースについて説明しました。
サンプルコードは、GitHubのにあります。