Kotlinでプログラムの条件分岐を効率よく記述するためには、when
文の活用が欠かせません。when
文は、Javaのswitch
文に似ていますが、より柔軟で強力な機能を備えています。特に複数の条件をスマートにチェックしたい場合、when
文を使うことでコードがシンプルになり、可読性が向上します。
本記事では、Kotlinのwhen
文を使った複数条件の処理方法について、基本構文から応用例まで詳しく解説します。複数の条件をまとめる方法や、範囲チェック、型チェック、スマートキャストを用いた効率的なコードの書き方について学んでいきましょう。
`when`文の基本構文
Kotlinのwhen
文は、複数の条件に対して分岐処理を行うための柔軟な構文です。Javaのswitch
文に似ていますが、Kotlinではより多様な条件を扱うことができます。
基本的な`when`文の書き方
以下は、when
文の基本的な構文の例です。
val number = 5
when (number) {
1 -> println("One")
2 -> println("Two")
3, 4 -> println("Three or Four")
in 5..10 -> println("Between Five and Ten")
else -> println("Other number")
}
各構文の解説
- 単一条件:
1
や2
のように、特定の値に対する条件を指定できます。 - 複数条件:
3, 4
のように、カンマで区切ることで複数の条件をまとめて指定できます。 - 範囲指定:
in 5..10
を使用すると、数値の範囲内にあるかどうかを確認できます。 else
ブロック:すべての条件に一致しない場合に実行されます。
`when`文を式として使う
when
文は、式としても利用でき、値を返すことができます。
val result = when (number) {
1 -> "One"
2 -> "Two"
else -> "Other"
}
println(result)
このようにwhen
文を使えば、複数条件の処理が簡潔かつ分かりやすく記述できます。
複数条件の処理方法
Kotlinのwhen
文では、複数の条件を一度に評価することが可能です。これにより、複雑な条件分岐も簡潔に記述できます。
複数条件をカンマで並べる方法
when
文では、カンマ ,
を使って複数の条件をまとめて指定できます。
val fruit = "apple"
when (fruit) {
"apple", "banana", "grape" -> println("This is a fruit.")
"carrot", "spinach" -> println("This is a vegetable.")
else -> println("Unknown item.")
}
この例では、「apple」「banana」「grape」のいずれかに一致した場合に「This is a fruit.」と出力します。
複数条件を満たすパターン
条件が複数のケースに該当する場合、when
文は最初に一致したブロックだけを実行します。
val number = 3
when (number) {
1, 2 -> println("Number is 1 or 2")
3, 4 -> println("Number is 3 or 4")
else -> println("Other number")
}
この例では、number
が3
なので「Number is 3 or 4」が出力されます。
関数や式を条件に使う
when
文では、関数や計算式を条件として使うこともできます。
val num = 15
when {
num % 2 == 0 -> println("Even number")
num % 3 == 0 -> println("Divisible by 3")
else -> println("Other condition")
}
この場合、num
が3
で割り切れるため「Divisible by 3」と出力されます。
複数条件を効率よく処理する
複数の条件を一括で処理することで、冗長なif-else
構文を避け、コードをシンプルに保つことができます。when
文を使うと、直感的で読みやすいコードが書けるため、条件分岐が多い場面で積極的に活用しましょう。
複数の条件をグループ化する方法
Kotlinのwhen
文では、複数の条件をグループ化して効率的に処理できます。特定の条件に対して共通の処理を割り当てることで、コードの重複を減らし、可読性を向上させます。
複数の値を一括で処理する
when
文でカンマ ,
を使用すると、複数の条件をグループ化し、同じ処理を適用できます。
val day = "Monday"
when (day) {
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> println("Weekday")
"Saturday", "Sunday" -> println("Weekend")
else -> println("Invalid day")
}
この例では、「Monday」から「Friday」までの平日がグループ化されており、週末は別のグループで処理されています。
条件に共通の処理を適用する
複数の条件に共通する処理がある場合、それらを一つのブロックでまとめられます。
val grade = "A"
when (grade) {
"A", "B", "C" -> println("Pass")
"D", "E" -> println("Fail")
else -> println("Invalid grade")
}
この例では、「A」「B」「C」のいずれかに該当すれば「Pass」と表示し、「D」「E」の場合は「Fail」と表示します。
複数の条件を関数や式でまとめる
条件を関数や計算式でまとめることで、さらに柔軟なグループ化が可能です。
val score = 85
when {
score >= 90 -> println("Excellent")
score in 70..89 -> println("Good")
score in 50..69 -> println("Average")
else -> println("Needs Improvement")
}
この例では、点数の範囲に応じてメッセージを出力します。in 70..89
のように範囲指定を用いることで、条件のグループ化が簡単にできます。
グループ化の利点
- コードの簡潔化:同じ処理を複数回書かずに済むため、コードがすっきりします。
- 可読性の向上:グループ化により、条件が明確になり、理解しやすくなります。
- メンテナンス性:処理の変更が必要な場合、一箇所を修正するだけで済みます。
複数条件のグループ化を活用することで、より効率的で読みやすいKotlinコードを実現できます。
`when`文の式としての利用
Kotlinのwhen
文は、ステートメントとしてだけでなく、式として利用できる点が大きな特徴です。これにより、when
文の結果を変数に代入したり、関数の戻り値として使うことができます。
`when`文を式として使う基本
when
文が式として利用される場合、各ブロックで返される値がそのままwhen
文全体の結果になります。以下の例を見てみましょう。
val grade = "B"
val result = when (grade) {
"A" -> "Excellent"
"B" -> "Good"
"C" -> "Average"
else -> "Fail"
}
println(result) // 出力: Good
この例では、when
文の結果がresult
変数に代入され、grade
が「B」の場合は「Good」が返されます。
関数の戻り値としての`when`文
関数の中でwhen
文を式として使い、結果を直接返すことも可能です。
fun getFeedback(score: Int): String {
return when {
score >= 90 -> "Excellent"
score in 70..89 -> "Good"
score in 50..69 -> "Average"
else -> "Needs Improvement"
}
}
println(getFeedback(85)) // 出力: Good
この例では、点数に応じたフィードバックをwhen
文で生成し、関数の戻り値として返しています。
式として使う際の注意点
- すべての条件が網羅されていることが重要です。網羅されていない場合、
else
ブロックを追加することで安全に利用できます。 - 型の統一が必要です。各ブロックの戻り値の型が異なると、コンパイルエラーが発生します。
val number = 5
val result = when (number) {
1 -> "One"
2 -> "Two"
else -> "Other"
}
// 以下はエラー: 型が統一されていない
// val invalidResult = when (number) {
// 1 -> "One"
// 2 -> 2 // StringとIntが混在
// }
複雑な条件をシンプルにまとめる
when
文を式として使うことで、複雑なロジックをシンプルに記述できます。if-else
の連鎖を避け、コードの見通しが良くなります。
val input = 7
val category = when {
input % 2 == 0 -> "Even"
input % 2 != 0 -> "Odd"
else -> "Unknown"
}
println(category) // 出力: Odd
まとめ
- 変数への代入や関数の戻り値として
when
文を活用できる。 - 型の統一と条件の網羅に注意することで、安全に使用できる。
- コードの可読性と効率性が向上するため、積極的に活用しましょう。
`when`文で型チェックとスマートキャスト
Kotlinのwhen
文は、型チェックとスマートキャストを活用することで、型に応じた処理を効率的に記述できます。これにより、ダウンキャストを明示的に行わなくても、Kotlinが自動的に適切な型として認識し、安全に処理を行えます。
型チェックの基本構文
when
文の条件でis
キーワードを使用することで、オブジェクトの型をチェックできます。
fun handleInput(input: Any) {
when (input) {
is String -> println("This is a String: ${input.uppercase()}")
is Int -> println("This is an Int: ${input * 2}")
is Boolean -> println("This is a Boolean: $input")
else -> println("Unknown type")
}
}
handleInput("hello") // 出力: This is a String: HELLO
handleInput(10) // 出力: This is an Int: 20
handleInput(true) // 出力: This is a Boolean: true
スマートキャストとは
Kotlinでは、型チェックが成功すると、その変数は自動的にその型としてキャストされます。これがスマートキャストです。明示的なキャストを行わなくても、チェック後に適切な型として扱えます。
fun processInput(input: Any) {
when (input) {
is String -> {
// `input`は自動的にStringとしてキャストされる
println("Length of the string: ${input.length}")
}
is List<*> -> {
// `input`はListとしてキャストされる
println("List size: ${input.size}")
}
}
}
processInput("Kotlin") // 出力: Length of the string: 6
processInput(listOf(1, 2, 3)) // 出力: List size: 3
複数の型条件を組み合わせる
when
文で複数の型条件を組み合わせて指定することも可能です。
fun evaluateInput(input: Any) {
when (input) {
is String, is CharSequence -> println("This is some kind of text.")
is Number -> println("This is a number.")
else -> println("Other type")
}
}
evaluateInput("text") // 出力: This is some kind of text.
evaluateInput(42) // 出力: This is a number.
型チェックとスマートキャストの利点
- 安全性:明示的なキャストが不要なため、
ClassCastException
のリスクが減ります。 - 可読性:コードがシンプルで読みやすくなります。
- 効率性:不要なキャスト操作を避け、パフォーマンスが向上します。
注意点
- スマートキャストは不変変数(
val
)にのみ適用されます。再代入可能な変数(var
)では適用されないため注意が必要です。
var input: Any = "Hello"
if (input is String) {
// ここではスマートキャストされない
// println(input.length) // エラー
}
val fixedInput: Any = "Hello"
if (fixedInput is String) {
println(fixedInput.length) // スマートキャストされる
}
型チェックとスマートキャストを活用し、Kotlinのwhen
文で効率的なコードを書きましょう。
`when`文で範囲をチェックする方法
Kotlinのwhen
文では、数値や文字の範囲をチェックするためにin
キーワードを使用できます。これにより、条件をシンプルかつ直感的に記述でき、複数の連続した値を効率的に評価することが可能です。
数値の範囲チェック
数値の範囲を条件に指定する場合、in
と範囲演算子 ..
を用います。
val score = 85
when (score) {
in 90..100 -> println("Excellent")
in 70..89 -> println("Good")
in 50..69 -> println("Average")
else -> println("Needs Improvement")
}
この例では、score
が85
なので「Good」と出力されます。in 70..89
は、70
から89
までの範囲にあることを示しています。
文字の範囲チェック
文字にも範囲演算子を使用してチェックできます。
val grade = 'B'
when (grade) {
in 'A'..'C' -> println("Pass")
in 'D'..'F' -> println("Fail")
else -> println("Invalid grade")
}
この例では、grade
が'B'
なので「Pass」と出力されます。
複数の範囲条件を組み合わせる
複数の範囲を組み合わせることで、柔軟な条件指定が可能です。
val temperature = 35
when (temperature) {
in -50..0 -> println("Freezing")
in 1..15 -> println("Cold")
in 16..30 -> println("Warm")
in 31..50 -> println("Hot")
else -> println("Temperature out of range")
}
この例では、temperature
が35
なので「Hot」と出力されます。
否定の範囲チェック
!in
を使うことで、範囲外の条件を指定できます。
val age = 17
when (age) {
!in 18..65 -> println("Not eligible for full-time work")
else -> println("Eligible for full-time work")
}
この例では、age
が17
なので「Not eligible for full-time work」と出力されます。
リストやコレクションの範囲チェック
when
文では、リストやセットなどのコレクションに対しても範囲チェックができます。
val item = "banana"
when (item) {
in listOf("apple", "banana", "grape") -> println("This is a fruit")
in listOf("carrot", "spinach") -> println("This is a vegetable")
else -> println("Unknown item")
}
この例では、item
が"banana"
なので「This is a fruit」と出力されます。
まとめ
- 数値や文字の範囲チェックが可能。
in
や!in
を使って条件を直感的に記述できる。- コレクションの要素も範囲チェックの対象にできる。
when
文で範囲を活用することで、複数条件の分岐が効率的に行え、コードがシンプルになります。
`when`文の代替手段としての`if-else`との比較
Kotlinで条件分岐を行う際、when
文とif-else
文はよく使われる手段です。どちらも条件に応じた処理を記述できますが、用途や可読性に違いがあります。それぞれの特徴や使い分けについて解説します。
`if-else`文の特徴
if-else
文は、シンプルな条件分岐や2~3個の条件を評価する場合に適しています。
val number = 10
if (number > 0) {
println("Positive")
} else if (number < 0) {
println("Negative")
} else {
println("Zero")
}
利点
- シンプルな条件分岐に適している。
- 条件が連続しない場合や、ブール値の評価に向いている。
欠点
- 条件が多くなると、
if-else
が連鎖し、コードが冗長になる。 - 複数条件があると、可読性が低下しやすい。
`when`文の特徴
when
文は、複数の条件や特定の値、範囲、型などを柔軟に評価する場合に適しています。
val number = 10
when {
number > 0 -> println("Positive")
number < 0 -> println("Negative")
else -> println("Zero")
}
利点
- 複数の条件をシンプルに記述できる。
- 値や型、範囲を使った柔軟な条件分岐が可能。
- 直感的で可読性が高い。
- 式としても利用できるため、結果を変数に代入しやすい。
欠点
- シンプルなブール値の分岐では冗長になることがある。
使い分けのポイント
条件 | if-else 文が適している | when 文が適している |
---|---|---|
条件の数が少ない | ○ | △ |
複数の値や範囲を評価する | △ | ○ |
型チェックが必要 | △ | ○ |
式として使いたい | △ | ○ |
例:複数条件の分岐
if-else
文の場合
val day = "Monday"
if (day == "Monday" || day == "Tuesday" || day == "Wednesday") {
println("Weekday")
} else if (day == "Saturday" || day == "Sunday") {
println("Weekend")
} else {
println("Invalid day")
}
when
文の場合
val day = "Monday"
when (day) {
"Monday", "Tuesday", "Wednesday" -> println("Weekday")
"Saturday", "Sunday" -> println("Weekend")
else -> println("Invalid day")
}
when
文のほうが条件が直感的に記述され、可読性が向上します。
まとめ
- シンプルな条件分岐には
if-else
文が適しています。 - 複数条件や特定の値・範囲・型チェックが必要な場合は
when
文を活用しましょう。 - 可読性や保守性を考慮して、状況に応じた適切な文法を選択しましょう。
`when`文の応用例
Kotlinのwhen
文は柔軟性が高く、多様な場面で活用できます。ここでは、実際の開発に役立つ応用例を紹介します。
1. 複雑な条件分岐の処理
複数の条件を組み合わせて、より複雑な分岐処理をwhen
文で実装できます。
fun getDiscount(customerType: String, purchaseAmount: Int): Double {
return when {
customerType == "Premium" && purchaseAmount >= 1000 -> 0.2
customerType == "Premium" -> 0.1
customerType == "Regular" && purchaseAmount >= 500 -> 0.05
else -> 0.0
}
}
println(getDiscount("Premium", 1200)) // 出力: 0.2
この例では、顧客の種類と購入金額に応じて異なる割引率を返しています。
2. 状態管理の処理
when
文を使って、アプリケーションの状態管理を簡潔に記述できます。
enum class AppState {
LOADING, SUCCESS, ERROR
}
fun handleAppState(state: AppState) {
when (state) {
AppState.LOADING -> println("Loading data...")
AppState.SUCCESS -> println("Data loaded successfully!")
AppState.ERROR -> println("Error occurred while loading data.")
}
}
handleAppState(AppState.SUCCESS) // 出力: Data loaded successfully!
状態管理が必要な場合、enum
とwhen
文を組み合わせるとシンプルで分かりやすくなります。
3. データクラスのパターンマッチング
データクラスを使い、条件に応じた処理を行う応用例です。
sealed class Shape
data class Circle(val radius: Double) : Shape()
data class Rectangle(val width: Double, val height: Double) : Shape()
object UnknownShape : Shape()
fun describeShape(shape: Shape) {
when (shape) {
is Circle -> println("This is a circle with radius ${shape.radius}")
is Rectangle -> println("This is a rectangle with width ${shape.width} and height ${shape.height}")
UnknownShape -> println("This is an unknown shape")
}
}
describeShape(Circle(5.0)) // 出力: This is a circle with radius 5.0
describeShape(Rectangle(3.0, 4.0)) // 出力: This is a rectangle with width 3.0 and height 4.0
この例では、sealed class
とwhen
文を組み合わせて、型に応じた処理を行っています。
4. HTTPステータスコードの処理
HTTPリクエストのレスポンスステータスに応じて異なる処理を行う例です。
fun handleHttpStatus(statusCode: Int) {
when (statusCode) {
in 200..299 -> println("Request succeeded")
in 400..499 -> println("Client error occurred")
in 500..599 -> println("Server error occurred")
else -> println("Unknown status code")
}
}
handleHttpStatus(404) // 出力: Client error occurred
ステータスコードの範囲指定を使うことで、シンプルに処理を記述できます。
5. ユーザー入力の検証
ユーザーの入力値を検証する際にもwhen
文は役立ちます。
fun validateInput(input: Any) {
when (input) {
is String -> println("You entered a string: $input")
is Int -> println("You entered an integer: $input")
is Boolean -> println("You entered a boolean: $input")
else -> println("Invalid input type")
}
}
validateInput("Kotlin") // 出力: You entered a string: Kotlin
validateInput(123) // 出力: You entered an integer: 123
validateInput(true) // 出力: You entered a boolean: true
まとめ
- 複雑な条件分岐、状態管理、パターンマッチングなど、多様な場面で
when
文が活躍します。 - 可読性とメンテナンス性が向上するため、条件分岐には積極的に
when
文を活用しましょう。
まとめ
本記事では、Kotlinにおけるwhen
文の基本構文から、複数条件の処理、範囲や型チェック、スマートキャスト、そして実際の応用例まで詳しく解説しました。
when
文は、if-else
文と比べて柔軟性が高く、複数の条件を簡潔に記述できます。また、式として利用することで、結果を直接変数に代入したり、関数の戻り値として使えます。型チェックや範囲指定、データクラスのパターンマッチングといった高度な使い方もサポートしており、Kotlinプログラミングを効率的かつ読みやすくする強力なツールです。
適切にwhen
文を活用することで、可読性が高く、保守しやすいコードを書けるようになります。これを機に、Kotlinのwhen
文をマスターし、日々の開発に役立てましょう。
コメント