制御フロー
他のプログラミング言語と同様に、Kotlinはコードの評価が真であるかどうかに基づいて判断を下すことができます。このようなコードは条件式と呼ばれます。Kotlinはループを作成して反復処理することもできます。
条件式
Kotlinは条件式をチェックするためにif
とwhen
を提供します。
if
とwhen
のどちらかを選択する必要がある場合、when
の使用をお勧めします。なぜなら、when
は以下の利点があるためです。
- コードを読みやすくします。
- 別の分岐を追加しやすくなります。
- コード内の間違いを減らすことができます。
If
if
を使用するには、条件式を丸括弧()
内に、結果が真である場合に実行するアクションを波括弧{}
内に追加します。
fun main() {
val d: Int
val check = true
if (check) {
d = 1
} else {
d = 2
}
println(d)
// 1
}
Kotlinには三項演算子 condition ? then : else
はありません。代わりに、if
は式として使用できます。各アクションにコードが1行しかない場合、波括弧{}
はオプションです。
fun main() {
val a = 1
val b = 2
println(if (a > b) a else b) // 値を返します: 2
}
When
複数の分岐を持つ条件式がある場合は、when
を使用します。
when
を使用するには、以下の手順を実行します。
- 評価したい値を丸括弧
()
内に配置します。 - 分岐を波括弧
{}
内に配置します。 - 各分岐で
->
を使用して、各チェックと、チェックが成功した場合に実行するアクションを区切ります。
when
はステートメントとしても式としても使用できます。ステートメントは何も返さず、代わりにアクションを実行します。
when
をステートメントとして使用する例を以下に示します。
fun main() {
val obj = "Hello"
when (obj) {
// objが"1"と等しいかどうかをチェックします
"1" -> println("One")
// objが"Hello"と等しいかどうかをチェックします
"Hello" -> println("Greeting")
// デフォルトのステートメント
else -> println("Unknown")
}
// Greeting
}
すべての分岐条件は、いずれかが満たされるまで順番にチェックされることに注意してください。したがって、最初に合致する分岐のみが実行されます。
式は、後でコードで使用できる値を返します。
when
を式として使用する例を以下に示します。when
式は変数に即座に割り当てられ、その変数は後でprintln()
関数で使用されます。
fun main() {
val obj = "Hello"
val result = when (obj) {
// objが"1"と等しい場合、resultを"one"に設定します
"1" -> "One"
// objが"Hello"と等しい場合、resultを"Greeting"に設定します
"Hello" -> "Greeting"
// 以前の条件が満たされない場合、resultを"Unknown"に設定します
else -> "Unknown"
}
println(result)
// Greeting
}
ここまで見てきたwhen
の例は、どちらもobj
というサブジェクト(対象)を持っていました。しかし、when
はサブジェクトなしでも使用できます。
この例では、サブジェクトなしのwhen
式を使用して、一連のBoolean式をチェックします。
fun main() {
val trafficLightState = "Red" // これは「Green」、「Yellow」、または「Red」になります
val trafficAction = when {
trafficLightState == "Green" -> "Go"
trafficLightState == "Yellow" -> "Slow down"
trafficLightState == "Red" -> "Stop"
else -> "Malfunction"
}
println(trafficAction)
// Stop
}
ただし、trafficLightState
をサブジェクトとして同じコードを記述することもできます。
fun main() {
val trafficLightState = "Red" // これは「Green」、「Yellow」、または「Red」になります
val trafficAction = when (trafficLightState) {
"Green" -> "Go"
"Yellow" -> "Slow down"
"Red" -> "Stop"
else -> "Malfunction"
}
println(trafficAction)
// Stop
}
サブジェクト付きでwhen
を使用すると、コードが読みやすくなり、保守も容易になります。when
式でサブジェクトを使用すると、Kotlinがすべての可能なケースが網羅されているかを確認するのにも役立ちます。そうしない場合、つまりwhen
式でサブジェクトを使用しない場合は、else
分岐を提供する必要があります。
条件式の練習
演習1
2つのサイコロを投げて同じ目が出たら勝ちとなるシンプルなゲームを作成してください。サイコロの目が一致したらYou win :)
を、そうでなければYou lose :(
をif
を使って出力してください。
TIP
この演習では、Random.nextInt()
関数を使用してランダムなInt
を取得できるように、パッケージをインポートします。パッケージのインポートに関する詳細については、パッケージとインポートを参照してください。
ヒント
==
)を使用してください。 import kotlin.random.Random
fun main() {
val firstResult = Random.nextInt(6)
val secondResult = Random.nextInt(6)
// Write your code here
}
解答例
import kotlin.random.Random
fun main() {
val firstResult = Random.nextInt(6)
val secondResult = Random.nextInt(6)
if (firstResult == secondResult)
println("You win :)")
else
println("You lose :(")
}
演習2
when
式を使用して、ゲームコンソールのボタン名を入力すると、対応するアクションが出力されるように以下のプログラムを更新してください。
ボタン | アクション |
---|---|
A | はい |
B | いいえ |
X | メニュー |
Y | 何もしない |
その他 | そのようなボタンはありません |
fun main() {
val button = "A"
println(
// Write your code here
)
}
解答例
fun main() {
val button = "A"
println(
when (button) {
"A" -> "Yes"
"B" -> "No"
"X" -> "Menu"
"Y" -> "Nothing"
else -> "There is no such button"
}
)
}
For
レンジの新しい知識を使って、1から5までの数値を反復処理し、毎回その数値を出力するfor
ループを作成できます。
イテレータとレンジをキーワードin
とともに丸括弧()
内に配置します。完了したいアクションを波括弧{}
内に追加します。
fun main() {
for (number in 1..5) {
// numberはイテレータで、1..5はレンジです
print(number)
}
// 12345
}
コレクションもループによって反復処理できます。
fun main() {
val cakes = listOf("carrot", "cheese", "chocolate")
for (cake in cakes) {
println("Yummy, it's a $cake cake!")
}
// Yummy, it's a carrot cake!
// Yummy, it's a cheese cake!
// Yummy, it's a chocolate cake!
}
While
while
は2つの方法で使用できます。
- 条件式が真である間、コードブロックを実行する。(
while
) - 最初にコードブロックを実行し、その後条件式をチェックする。(
do-while
)
最初のユースケース(while
)では:
while
ループを継続するための条件式を丸括弧()
内に宣言します。- 完了したいアクションを波括弧
{}
内に追加します。
以下の例では、
cakesEaten
変数の値をインクリメントするためにインクリメント演算子++
を使用します。
fun main() {
var cakesEaten = 0
while (cakesEaten < 3) {
println("Eat a cake")
cakesEaten++
}
// Eat a cake
// Eat a cake
// Eat a cake
}
2番目のユースケース(do-while
)では:
while
ループを継続するための条件式を丸括弧()
内に宣言します。- 完了したいアクションをキーワード
do
とともに波括弧{}
内で定義します。
fun main() {
var cakesEaten = 0
var cakesBaked = 0
while (cakesEaten < 3) {
println("Eat a cake")
cakesEaten++
}
do {
println("Bake a cake")
cakesBaked++
} while (cakesBaked < cakesEaten)
// Eat a cake
// Eat a cake
// Eat a cake
// Bake a cake
// Bake a cake
// Bake a cake
}
条件式とループに関する詳細および例については、条件とループを参照してください。
Kotlinの制御フローの基本を理解したところで、独自の関数を記述する方法を学ぶ時が来ました。
ループの練習
演習1
ピザが8切れになるまでピザの切れ数を数えるプログラムがあります。このプログラムを以下の2つの方法でリファクタリングしてください。
while
ループを使用する。do-while
ループを使用する。
fun main() {
var pizzaSlices = 0
// ここからリファクタリングを開始
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
// ここでリファクタリングを終了
println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
解答例1
fun main() {
var pizzaSlices = 0
while ( pizzaSlices < 7 ) {
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
}
pizzaSlices++
println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
解答例2
fun main() {
var pizzaSlices = 0
pizzaSlices++
do {
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
} while ( pizzaSlices < 8 )
println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
演習2
Fizz buzzゲームをシミュレートするプログラムを記述してください。あなたのタスクは、1から100までの数を増分しながら出力し、3で割り切れる場合は「fizz」に、5で割り切れる場合は「buzz」に置き換えることです。3と5の両方で割り切れる場合は「fizzbuzz」に置き換えなければなりません。
ヒント1
for
ループを、各ステップで何を出力するかを決定するにはwhen
式を使用してください。 ヒント2
fun main() {
// Write your code here
}
解答例
fun main() {
for (number in 1..100) {
println(
when {
number % 15 == 0 -> "fizzbuzz"
number % 3 == 0 -> "fizz"
number % 5 == 0 -> "buzz"
else -> "$number"
}
)
}
}
演習3
単語のリストがあります。for
とif
を使用して、文字l
で始まる単語のみを出力してください。
ヒント
String
型には.startsWith()
関数を使用してください。 fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
// ここにコードを記述してください
}
解答例
fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
for (w in words) {
if (w.startsWith("l"))
println(w)
}
}