Kotlinのwhen文を使った簡潔な条件分岐の書き方と応用例

Kotlinでは、簡潔で柔軟な条件分岐を実現するためにwhen文が利用されます。Javaのswitch文に似ていますが、Kotlinのwhen文はさらに強力で、型に依存しない多様な条件分岐をサポートします。この記事では、when文を使った基本的な条件分岐から応用例までを詳しく解説します。プログラムの可読性や保守性を向上させたい方にとって、when文の活用は非常に有効です。本記事を通じて、Kotlinプログラミングのスキルをさらに向上させましょう。

目次

Kotlinのwhen文とは


Kotlinのwhen文は、条件に応じて異なる処理を実行するための分岐構文です。Javaのswitch文と似た役割を果たしますが、より柔軟で直感的な書き方が可能です。特定の値だけでなく、条件式や型判定、範囲チェックなど、さまざまなケースに対応しています。

基本構文


Kotlinのwhen文の基本的な構文は以下の通りです。

when (expression) {
    value1 -> // value1の場合の処理
    value2 -> // value2の場合の処理
    else ->   // 上記以外の場合の処理
}

特徴

  • 値だけでなく条件式を使用可能: 各分岐に具体的な値ではなく、式を記述できます。
  • elseブロックの必須性: 全ての条件に一致しない場合の処理をelseで指定できます。
  • 式として使用可能: when文自体が値を返すため、簡潔なコードが書けます。

Kotlinのwhen文は、単純な条件分岐から複雑な分岐ロジックまで幅広く対応可能な、非常に強力なツールです。

when文の基本的な使用例


Kotlinのwhen文を使った基本的な条件分岐の例を示します。ここでは、シンプルな値の比較を行う場合を想定します。

単純な値の条件分岐


以下のコードは、数値の値に応じてメッセージを出力する例です。

fun main() {
    val number = 3

    when (number) {
        1 -> println("One")
        2 -> println("Two")
        3 -> println("Three")
        else -> println("Unknown number")
    }
}

このコードでは、numberの値が123のいずれかの場合に対応するメッセージを出力し、それ以外の場合は"Unknown number"と表示されます。

複数の条件をグループ化


複数の値を同じ処理にまとめることもできます。

fun main() {
    val day = "Saturday"

    when (day) {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> println("Weekday")
        "Saturday", "Sunday" -> println("Weekend")
        else -> println("Invalid day")
    }
}

この例では、複数の条件をカンマで区切ることで、「平日」や「週末」を簡潔にグループ化しています。

範囲条件を使用


inキーワードを使って範囲条件を指定することもできます。

fun main() {
    val score = 85

    when (score) {
        in 90..100 -> println("Excellent")
        in 70..89 -> println("Good")
        in 50..69 -> println("Pass")
        else -> println("Fail")
    }
}

この例では、スコアがどの範囲に含まれるかによって、異なる評価を表示します。

基本例のまとめ


Kotlinのwhen文を使用すると、複数の条件分岐をシンプルかつ効率的に表現できます。単純な値のチェックや条件のグループ化、範囲指定など、多様な条件に対応可能です。これにより、可読性の高いコードを書くことができます。

条件に基づく分岐の詳細な解説


Kotlinのwhen文は、単純な値比較だけでなく、式や型判定、条件式を使用した柔軟な条件分岐をサポートします。ここでは、それらの詳細な使い方を解説します。

条件式を利用した分岐


when文では、値ではなく条件式を記述することで、より複雑なロジックを実現できます。

fun main() {
    val number = -5

    when {
        number > 0 -> println("Positive number")
        number < 0 -> println("Negative number")
        else -> println("Zero")
    }
}

この例では、numberが正の数か負の数か、またはゼロかを判定しています。条件式を直接記述できるため、コードが簡潔になります。

型判定を利用した分岐


isキーワードを用いて、変数の型を判定し、それに応じた処理を行うことが可能です。

fun main() {
    val input: Any = "Hello, Kotlin"

    when (input) {
        is Int -> println("Input is an Integer: $input")
        is String -> println("Input is a String: $input")
        is Boolean -> println("Input is a Boolean: $input")
        else -> println("Unknown type")
    }
}

このコードでは、inputの型に応じて異なるメッセージを表示しています。型安全性を高めつつ、柔軟なロジックを記述できます。

複数条件の組み合わせ


複数条件を組み合わせてより複雑なロジックを作成することも可能です。

fun main() {
    val age = 25
    val isStudent = true

    when {
        age < 18 -> println("Minor")
        age in 18..22 && isStudent -> println("College student")
        age > 22 && isStudent -> println("Graduate student")
        else -> println("Adult")
    }
}

この例では、年齢と学生であるかどうかの両方を条件として使用しています。論理演算子を活用することで、柔軟な条件設定が可能です。

when文をネストする


複雑な条件分岐が必要な場合は、when文をネストして使用することもできます。

fun main() {
    val num = 10

    when {
        num % 2 == 0 -> {
            when {
                num > 0 -> println("Positive even number")
                num < 0 -> println("Negative even number")
                else -> println("Zero")
            }
        }
        else -> println("Odd number")
    }
}

ネストを活用することで、複雑なロジックを階層的に整理できます。

詳細な分岐のまとめ


Kotlinのwhen文は、値のチェックだけでなく条件式や型判定、論理演算などを活用して多様な分岐処理を実現できます。この柔軟性により、複雑な条件分岐も簡潔かつ効率的に表現可能です。これを活用することで、保守性の高いコードを書くことができます。

elseブロックの活用方法


Kotlinのwhen文において、elseブロックは非常に重要な役割を果たします。elseは、指定された条件に一致しない場合に実行されるデフォルトの処理を定義するためのもので、すべての可能性を網羅することで安全なコードを実現します。

基本的なelseブロックの使用


elseブロックは、条件分岐の最後に記述されます。以下は、基本的な使用例です。

fun main() {
    val grade = "C"

    when (grade) {
        "A" -> println("Excellent")
        "B" -> println("Good")
        "C" -> println("Satisfactory")
        else -> println("Invalid grade")
    }
}

この例では、grade"A""B"、または"C"以外の場合、"Invalid grade"が出力されます。elseブロックがあることで、予期しない値に対する適切な処理が保証されます。

elseブロックの省略


特定の条件がすべて網羅されている場合は、elseブロックを省略することも可能です。

fun main() {
    val day = "Monday"

    when (day) {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> println("Weekday")
        "Saturday", "Sunday" -> println("Weekend")
    }
}

この例では、dayのすべての可能な値を条件に含めているため、elseは不要です。ただし、網羅性が確保されていない場合、実行時にエラーが発生する可能性があるため注意が必要です。

elseブロックで例外をスロー


elseブロックは、予期しない状況に対して例外をスローする場合にも使用されます。

fun main() {
    val status = "unknown"

    when (status) {
        "active" -> println("Status is active")
        "inactive" -> println("Status is inactive")
        else -> throw IllegalArgumentException("Invalid status: $status")
    }
}

この例では、statusが不明な値であれば例外がスローされ、問題を明示的に示すことができます。

elseブロックを使わない条件式


すべての条件を網羅する場合、elseブロックを使わずにwhen文を式として完結させることもできます。

fun main() {
    val number = 2

    val result = when (number) {
        1 -> "One"
        2 -> "Two"
        3 -> "Three"
        else -> "Unknown"
    }
    println(result)
}

この場合、elseブロックがないとコンパイルエラーとなるため、網羅性が強制されます。

elseブロックのまとめ


elseブロックを活用することで、条件分岐の安全性と可読性が向上します。特に、予期しない入力や例外処理を明確にする場合に有効です。ただし、全条件を明示的に網羅できる場合は、省略して簡潔なコードを書くことも可能です。これらを状況に応じて使い分けることで、信頼性の高いプログラムを構築できます。

when文の式としての利用


Kotlinのwhen文は、通常の条件分岐だけでなく「式」としても利用できます。式として使用すると、条件に応じて戻り値を生成することが可能になり、コードをさらに簡潔にすることができます。

when文を式として使用する基本例


以下の例では、when文が式として利用され、条件に応じた値を返しています。

fun main() {
    val number = 2

    val result = when (number) {
        1 -> "One"
        2 -> "Two"
        3 -> "Three"
        else -> "Unknown"
    }

    println(result)  // Output: Two
}

この例では、numberの値に基づいてresultに適切な文字列を代入しています。式としてのwhen文は、if-elseを使った条件分岐よりも簡潔に記述できます。

式としてのwhen文とデフォルト値


elseブロックを使用して、すべての条件が網羅されるようにする必要があります。elseがない場合、未定義の条件に対してコンパイルエラーが発生します。

fun getDayType(day: String): String {
    return when (day) {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Weekday"
        "Saturday", "Sunday" -> "Weekend"
        else -> "Invalid day"
    }
}

fun main() {
    println(getDayType("Sunday"))  // Output: Weekend
    println(getDayType("Funday"))  // Output: Invalid day
}

このコードでは、関数getDayTypedayの値に基づいて適切な結果を返します。

複雑な条件式を使用した場合の戻り値


複数の条件式や範囲条件も式として活用できます。

fun getGrade(score: Int): String {
    return when (score) {
        in 90..100 -> "A"
        in 80..89 -> "B"
        in 70..79 -> "C"
        in 60..69 -> "D"
        else -> "F"
    }
}

fun main() {
    println(getGrade(85))  // Output: B
    println(getGrade(50))  // Output: F
}

この例では、スコアに基づいてグレードを返す処理をシンプルに記述しています。

式としてのwhen文の応用例


以下のように、式としてのwhen文を直接関数の戻り値として利用することで、コードをさらに簡潔化できます。

fun isEvenOrOdd(number: Int) = when {
    number % 2 == 0 -> "Even"
    else -> "Odd"
}

fun main() {
    println(isEvenOrOdd(4))  // Output: Even
    println(isEvenOrOdd(7))  // Output: Odd
}

この例では、isEvenOrOdd関数がwhen文を使って偶数・奇数判定を行い、その結果を直接返しています。

まとめ


when文を式として利用することで、条件分岐の結果を簡潔に取得できます。これにより、冗長な変数代入を省略し、コードをクリーンで読みやすいものにできます。この特徴を活用すれば、効率的かつ直感的なプログラミングが可能です。

複雑な条件の処理方法


Kotlinのwhen文では、単純な値のチェックに加えて、論理演算や範囲条件、関数呼び出しを組み合わせて複雑な条件を表現することができます。これにより、柔軟性の高い条件分岐を記述できます。

論理演算を使った条件


複数の条件を論理演算子(&&||)で組み合わせることで、より詳細な分岐が可能です。

fun main() {
    val age = 20
    val isStudent = true

    when {
        age < 18 -> println("Minor")
        age >= 18 && isStudent -> println("College student")
        age >= 18 && !isStudent -> println("Adult")
        else -> println("Unknown category")
    }
}

この例では、年齢と学生ステータスに基づいて異なるメッセージを出力します。論理演算を使用すると、複雑な条件でも簡潔に記述できます。

範囲条件を使用


inキーワードを使用することで、範囲を条件として記述できます。

fun main() {
    val score = 75

    when (score) {
        in 90..100 -> println("Excellent")
        in 70..89 -> println("Good")
        in 50..69 -> println("Pass")
        else -> println("Fail")
    }
}

このコードでは、スコアがどの範囲に属するかによって評価を分岐します。inキーワードを使うことで、範囲指定が簡潔に行えます。

条件式を関数で処理


条件式に関数を組み込むことで、さらに柔軟な条件分岐を実現できます。

fun isPrime(num: Int): Boolean {
    if (num < 2) return false
    for (i in 2 until num) {
        if (num % i == 0) return false
    }
    return true
}

fun main() {
    val number = 7

    when {
        isPrime(number) -> println("$number is a prime number")
        number % 2 == 0 -> println("$number is an even number")
        else -> println("$number is an odd number")
    }
}

この例では、isPrime関数を利用して、素数かどうかを判定しています。条件式の中で関数を呼び出せるため、より直感的なコードを書けます。

when文をネストして複雑さを管理


複雑な条件分岐が必要な場合、when文をネストして整理することができます。

fun main() {
    val temperature = 30
    val humidity = 70

    when {
        temperature > 35 -> println("Too hot!")
        temperature in 20..35 -> when {
            humidity > 60 -> println("Warm and humid")
            else -> println("Pleasant weather")
        }
        else -> println("Cold")
    }
}

この例では、気温と湿度に基づいてメッセージを出力しています。ネストを活用することで、複数の条件を整理しやすくなります。

まとめ


Kotlinのwhen文は、論理演算や範囲条件、関数呼び出しを組み合わせることで複雑な条件分岐を簡潔に表現できます。これにより、コードの可読性と柔軟性が向上します。複雑な条件分岐が必要な場合でも、適切に整理されたコードを記述することで、メンテナンス性を高めることができます。

Kotlinのwhen文の応用例


Kotlinのwhen文は、単純な条件分岐だけでなく、実際のプロジェクトで役立つ高度な用途にも対応できます。ここでは、when文の応用例をいくつか紹介します。

APIレスポンスの処理


when文は、APIレスポンスのステータスコードを処理する際に便利です。

fun handleApiResponse(statusCode: Int): String {
    return when (statusCode) {
        200 -> "Success"
        400 -> "Bad Request"
        401 -> "Unauthorized"
        404 -> "Not Found"
        500 -> "Internal Server Error"
        else -> "Unknown Status"
    }
}

fun main() {
    val response = handleApiResponse(404)
    println(response)  // Output: Not Found
}

この例では、ステータスコードに応じて適切なメッセージを返す処理を実装しています。APIエラーの詳細を効率的に処理できます。

ユーザー入力の処理


ユーザー入力に基づいて処理を分岐する場合も、when文を活用できます。

fun processUserInput(input: String): String {
    return when (input.lowercase()) {
        "yes", "y" -> "You chose yes"
        "no", "n" -> "You chose no"
        "exit" -> "Exiting program"
        else -> "Invalid input"
    }
}

fun main() {
    val userInput = "yes"
    println(processUserInput(userInput))  // Output: You chose yes
}

この例では、when文を使用してユーザーの入力を処理し、適切な応答を返しています。

状態管理のロジック


when文は、アプリケーションの状態管理にも活用できます。

enum class AppState {
    LOADING, SUCCESS, ERROR
}

fun getStateMessage(state: AppState): String {
    return when (state) {
        AppState.LOADING -> "App is loading..."
        AppState.SUCCESS -> "App loaded successfully!"
        AppState.ERROR -> "An error occurred."
    }
}

fun main() {
    val currentState = AppState.SUCCESS
    println(getStateMessage(currentState))  // Output: App loaded successfully!
}

この例では、AppStateという列挙型を使用してアプリケーションの状態に応じたメッセージを表示しています。

複雑な計算ロジックの処理


when文を使って複雑な計算ロジックを処理することも可能です。

fun calculateTax(income: Double): Double {
    return when {
        income <= 10000 -> income * 0.1
        income <= 50000 -> income * 0.2
        else -> income * 0.3
    }
}

fun main() {
    val income = 45000.0
    println("Tax: ${calculateTax(income)}")  // Output: Tax: 9000.0
}

この例では、収入額に応じて異なる税率を適用しています。

言語切り替えの実装


多言語対応アプリケーションの実装にも役立ちます。

fun getGreeting(language: String): String {
    return when (language.lowercase()) {
        "english" -> "Hello"
        "spanish" -> "Hola"
        "french" -> "Bonjour"
        "japanese" -> "こんにちは"
        else -> "Language not supported"
    }
}

fun main() {
    println(getGreeting("japanese"))  // Output: こんにちは
}

この例では、入力された言語コードに応じて挨拶文を出力しています。

まとめ


Kotlinのwhen文は、APIレスポンスの処理、ユーザー入力の処理、状態管理、複雑な計算ロジック、言語切り替えなど、さまざまな応用が可能です。適切に活用することで、コードの可読性や効率性を向上させ、実用的なアプリケーションを構築することができます。

演習問題と解答例


Kotlinのwhen文を使った条件分岐について、理解を深めるための演習問題を用意しました。それぞれの問題に対する解答例も示します。

演習問題1: 数字の分類


以下の仕様に従って、数字を分類するプログラムを作成してください。

  • 入力が0の場合は「Zero」を出力する。
  • 正の偶数の場合は「Positive even number」を出力する。
  • 正の奇数の場合は「Positive odd number」を出力する。
  • 負の数の場合は「Negative number」を出力する。

解答例

fun classifyNumber(num: Int): String {
    return when {
        num == 0 -> "Zero"
        num > 0 && num % 2 == 0 -> "Positive even number"
        num > 0 -> "Positive odd number"
        else -> "Negative number"
    }
}

fun main() {
    println(classifyNumber(10))  // Output: Positive even number
    println(classifyNumber(-5))  // Output: Negative number
    println(classifyNumber(0))   // Output: Zero
}

演習問題2: 学生の成績評価


以下のスコア範囲に基づいて、学生の成績を評価するプログラムを作成してください。

  • スコアが90以上の場合は「A」
  • スコアが80以上90未満の場合は「B」
  • スコアが70以上80未満の場合は「C」
  • スコアが60以上70未満の場合は「D」
  • スコアが60未満の場合は「F」

解答例

fun evaluateGrade(score: Int): String {
    return when (score) {
        in 90..100 -> "A"
        in 80..89 -> "B"
        in 70..79 -> "C"
        in 60..69 -> "D"
        else -> "F"
    }
}

fun main() {
    println(evaluateGrade(85))  // Output: B
    println(evaluateGrade(55))  // Output: F
}

演習問題3: 曜日によるメッセージ


次の仕様を満たすプログラムを作成してください。

  • 入力が「Monday」「Tuesday」「Wednesday」「Thursday」「Friday」の場合は「Weekday」を出力する。
  • 入力が「Saturday」「Sunday」の場合は「Weekend」を出力する。
  • それ以外の場合は「Invalid day」を出力する。

解答例

fun getDayType(day: String): String {
    return when (day) {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Weekday"
        "Saturday", "Sunday" -> "Weekend"
        else -> "Invalid day"
    }
}

fun main() {
    println(getDayType("Sunday"))  // Output: Weekend
    println(getDayType("Funday"))  // Output: Invalid day
}

演習問題4: 言語の挨拶を出力


以下の仕様を満たすプログラムを作成してください。

  • 入力が「English」の場合は「Hello」を出力する。
  • 入力が「Spanish」の場合は「Hola」を出力する。
  • 入力が「French」の場合は「Bonjour」を出力する。
  • 入力が「Japanese」の場合は「こんにちは」を出力する。
  • それ以外の場合は「Language not supported」を出力する。

解答例

fun getGreeting(language: String): String {
    return when (language.lowercase()) {
        "english" -> "Hello"
        "spanish" -> "Hola"
        "french" -> "Bonjour"
        "japanese" -> "こんにちは"
        else -> "Language not supported"
    }
}

fun main() {
    println(getGreeting("Japanese"))  // Output: こんにちは
    println(getGreeting("Korean"))    // Output: Language not supported
}

まとめ


演習問題を通じて、Kotlinのwhen文を使用した条件分岐の実践的な応用方法を学ぶことができます。実際の開発に役立つロジックを構築する練習を重ねることで、プログラムの柔軟性と可読性を向上させましょう。

まとめ


本記事では、Kotlinのwhen文を使った条件分岐の基本から応用例までを解説しました。when文は、単純な値の比較だけでなく、条件式、範囲指定、型判定など多様なケースに対応可能で、柔軟で簡潔なコードを書くための強力なツールです。

応用例や演習問題を通じて、実践的な使い方も学びました。when文を正しく活用することで、プログラムの可読性と保守性を向上させ、より効率的な開発が可能になります。Kotlinの特性を最大限に生かし、実際のプロジェクトに役立ててください!

コメント

コメントする

目次