Kotlinのwhen文で複数条件をスマートにチェックする方法と活用例

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. 単一条件12のように、特定の値に対する条件を指定できます。
  2. 複数条件3, 4のように、カンマで区切ることで複数の条件をまとめて指定できます。
  3. 範囲指定in 5..10を使用すると、数値の範囲内にあるかどうかを確認できます。
  4. 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")
}

この例では、number3なので「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")
}

この場合、num3で割り切れるため「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")
}

この例では、score85なので「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")
}

この例では、temperature35なので「Hot」と出力されます。

否定の範囲チェック


!inを使うことで、範囲外の条件を指定できます。

val age = 17

when (age) {
    !in 18..65 -> println("Not eligible for full-time work")
    else -> println("Eligible for full-time work")
}

この例では、age17なので「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!

状態管理が必要な場合、enumwhen文を組み合わせるとシンプルで分かりやすくなります。

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 classwhen文を組み合わせて、型に応じた処理を行っています。

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文をマスターし、日々の開発に役立てましょう。

コメント

コメントする

目次