制御フロー
他のプログラミング言語と同様に、Kotlinはコードがtrueと評価されるかどうかに基づいて決定を下すことができます。このようなコードは条件式と呼ばれます。Kotlinはループを作成し、繰り返し処理を行うこともできます。
条件式
Kotlinは条件式をチェックするためにif
とwhen
を提供しています。
NOTE
if
とwhen
のどちらかを選択しなければならない場合、when
の使用をお勧めします。それは以下の理由によります。
コードが読みやすくなります。
別の分岐を追加しやすくなります。
コード内の間違いが少なくなります。
If
if
を使用するには、条件式を括弧()
内に、結果がtrueの場合に実行するアクションを波括弧{}
内に記述します。
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) // Returns a value: 2
}
When
複数の分岐を持つ条件式がある場合は、when
を使用します。
when
を使用するには:
- 評価したい値を括弧
()
内に配置します。 - 分岐を波括弧
{}
内に配置します。 - 各分岐で
->
を使用して、チェックと、チェックが成功した場合に実行するアクションを区切ります。
when
は文 (statement) または式 (expression) として使用できます。**文 (statement)**は何も返しませんが、アクションを実行します。
when
を文として使用する例を以下に示します。
fun main() {
val obj = "Hello"
when (obj) {
// Checks whether obj equals to "1"
"1" -> println("One")
// Checks whether obj equals to "Hello"
"Hello" -> println("Greeting")
// Default statement
else -> println("Unknown")
}
// Greeting
}
NOTE
すべての分岐条件は、いずれかが満たされるまで順次チェックされることに注意してください。したがって、最初に適合した分岐のみが実行されます。
**式 (expression)**は、後でコードで使用できる値を返します。
when
を式として使用する例を以下に示します。when
式はすぐに変数に割り当てられ、後でprintln()
関数で使用されます。
fun main() {
val obj = "Hello"
val result = when (obj) {
// If obj equals "1", sets result to "one"
"1" -> "One"
// If obj equals "Hello", sets result to "Greeting"
"Hello" -> "Greeting"
// Sets result to "Unknown" if no previous condition is satisfied
else -> "Unknown"
}
println(result)
// Greeting
}
これまでに見てきたwhen
の例はどちらも主題 (obj
) を持っていました。しかし、when
は主題なしでも使用できます。
この例では、主題なしのwhen
式を使用して、Boolean式の連鎖をチェックしています。
fun main() {
val trafficLightState = "Red" // This can be "Green", "Yellow", or "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" // This can be "Green", "Yellow", or "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
この演習では、ランダムなInt
を取得するためにRandom.nextInt()
関数を使用できるように、パッケージをインポートします。パッケージのインポートに関する詳細については、パッケージとインポートを参照してください。
ヒント
サイコロの結果を比較するには、等価演算子(==
)を使用します。
|---|---|
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 | 何もなし |
Other | そのようなボタンはありません |
|---|---|
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"
}
)
}
範囲 (Ranges)
ループが反復処理を行うための範囲を構築する方法を知っておくと、ループについて話す前に役立ちます。
Kotlinで範囲を作成する最も一般的な方法は、..
演算子を使用することです。たとえば、1..4
は1, 2, 3, 4
と同等です。
終了値を含まない範囲を宣言するには、..<
演算子を使用します。たとえば、1..<4
は1, 2, 3
と同等です。
逆順で範囲を宣言するには、downTo
を使用します。たとえば、4 downTo 1
は4, 3, 2, 1
と同等です。
1ではないステップでインクリメントする範囲を宣言するには、step
と希望する増分値を使用します。たとえば、1..5 step 2
は1, 3, 5
と同等です。
Char
型の範囲でも同様に行うことができます。
'a'..'d'
は'a', 'b', 'c', 'd'
と同等'z' downTo 's' step 2
は'z', 'x', 'v', 't'
と同等
ループ
プログラミングで最も一般的な2つのループ構造はfor
とwhile
です。for
は値の範囲を反復処理し、アクションを実行するために使用します。while
は特定の条件が満たされるまでアクションを続行するために使用します。
For
範囲に関する新しい知識を使って、1から5までの数値を反復処理し、その都度数値を出力するfor
ループを作成できます。
イテレータと範囲をキーワードin
とともに括弧()
内に配置します。実行したいアクションを波括弧{}
内に記述します。
fun main() {
for (number in 1..5) {
// number is the iterator and 1..5 is the range
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つの方法で使用できます。
- 条件式がtrueである間、コードブロックを実行する。 (
while
) - まずコードブロックを実行し、その後に条件式をチェックする。 (
do-while
)
最初の使用例 (while
) では:
while
ループを続行するための条件式を括弧()
内に宣言します。- 実行したいアクションを波括弧
{}
内に記述します。
TIP
以下の例では、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
// Start refactoring here
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++
// End refactoring here
println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
|---|---|
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")
}
|---|---|
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")
// Write your code here
}
|---|---|
fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
for (w in words) {
if (w.startsWith("l"))
println(w)
}
}