Kotlinでのwhen文の使い方をマスター!式として値を返す実践ガイド

Kotlinでのwhen文を活用することで、コードの可読性を大幅に向上させることができます。特に、when文を式として使用すると、条件に応じて値を返す柔軟なロジックを簡潔に記述できるため、プログラム全体の効率が上がります。本記事では、Kotlinのwhen文を式として使いこなす方法を中心に、基本的な構文から応用例までを徹底解説します。初めてKotlinを学ぶ方から経験者まで、すぐに実践できる具体例を交えて説明していきます。

目次

when文の基本構造


Kotlinのwhen文は、条件に応じて異なる処理を実行するための構文で、Javaのswitch文に相当する機能を持っています。ただし、より柔軟で簡潔な記述が可能です。基本的な構文は以下の通りです。

when (value) {
    condition1 -> result1
    condition2 -> result2
    else -> defaultResult
}

基本構文の例


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

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

特徴

  1. 値をチェックするだけでなく、式や関数の結果も使用可能: 条件に具体的な値だけでなく、複雑な式や関数の結果を利用できます。
  2. else句は必須ではないが推奨される: 全ての条件に一致しない場合のデフォルト処理としてelse句を使うことが推奨されます。

when文は単なる条件分岐を超えて、Kotlin特有のシンプルさと柔軟性を実現する強力なツールです。

when文を式として使用するとは

Kotlinでは、when文を式として使用することで、条件に応じた値を直接返すことができます。これにより、冗長なコードを簡潔にまとめることが可能です。式として使用する場合、when文全体が値を返すため、変数への代入や関数の戻り値として利用できます。

式としての基本構文


以下のコードは、when文を式として利用し、値を直接変数に代入する例です。

val value = 5
val description = when {
    value < 0 -> "Negative"
    value == 0 -> "Zero"
    value > 0 -> "Positive"
    else -> "Unknown"
}
println(description) // 出力: Positive

式として使用する際のポイント

  1. すべての条件が値を返す必要がある
    条件に一致する場合に必ず値が返されるよう、各分岐内で値を明示的に指定する必要があります。
  2. else句の重要性
    特定の条件に一致しない場合でも確実に値を返すために、else句を使用するのが一般的です。

関数の戻り値として使用する例


以下は、when文を式として使用し、関数の戻り値を返す例です。

fun evaluateGrade(grade: Int): String {
    return when (grade) {
        in 90..100 -> "Excellent"
        in 75..89 -> "Good"
        in 50..74 -> "Pass"
        else -> "Fail"
    }
}
println(evaluateGrade(85)) // 出力: Good

メリット

  • 条件分岐と値の代入を1つの構文で行えるため、コードが簡潔になる。
  • 値を返す構造が明確で、コードの意図が直感的に理解できる。

when文を式として使用することで、可読性と効率性の高いコードを実現できます。特に、複雑な条件分岐を含む処理では、when文を式として活用することが推奨されます。

条件分岐の設定方法と例

Kotlinのwhen文は、多様な条件を柔軟に設定できるため、様々な状況で活用できます。以下では、when文における条件の設定方法と具体例を紹介します。

単一値の条件


特定の値に対して処理を分岐させる最も基本的な条件設定です。

val day = "Monday"
val activity = when (day) {
    "Monday" -> "Go to work"
    "Saturday", "Sunday" -> "Relax at home"
    else -> "Unknown activity"
}
println(activity) // 出力: Go to work

範囲(Range)の条件


値が特定の範囲内にあるかどうかで条件分岐を行います。

val score = 85
val grade = when (score) {
    in 90..100 -> "A"
    in 80..89 -> "B"
    in 70..79 -> "C"
    else -> "F"
}
println(grade) // 出力: B

型チェックの条件


値の型に応じて処理を分岐させることが可能です。isキーワードを使用します。

val input: Any = "Hello"
val result = when (input) {
    is String -> "Input is a String"
    is Int -> "Input is an Integer"
    else -> "Unknown type"
}
println(result) // 出力: Input is a String

関数の結果を条件に使用


条件には関数の戻り値や計算結果を使用できます。

fun isEven(number: Int): Boolean = number % 2 == 0

val number = 4
val description = when {
    isEven(number) -> "Even"
    else -> "Odd"
}
println(description) // 出力: Even

条件のカスタマイズ


複数の条件をまとめたり、より複雑なロジックを設定することも可能です。

val temperature = 30
val status = when {
    temperature > 35 -> "Too hot"
    temperature in 15..35 -> "Comfortable"
    temperature < 15 -> "Too cold"
    else -> "Unknown"
}
println(status) // 出力: Comfortable

まとめ


Kotlinのwhen文では、単一の値、範囲、型チェック、関数の結果など、多様な条件を設定できます。この柔軟性により、複雑なロジックも簡潔に記述できるため、効率的なコード作成が可能です。適切な条件を選択し、スッキリとしたコードを書くことがポイントです。

elseを使ったデフォルトケースの重要性

Kotlinのwhen文では、すべての条件に一致しない場合の処理としてelse句を設定することができます。else句はオプションですが、明確に指定しておくことでコードの安全性と予測可能性が向上します。

else句の役割

  1. 予期しない入力への対応
    入力が想定した条件以外だった場合の処理を定義できます。これにより、エラーや未定義動作を回避できます。
  2. コードの完全性を保証
    全ての可能性を網羅するため、プログラムの動作が確実になります。
  3. 例外処理の削減
    予期しない状況で例外を投げる必要が減り、コードがより読みやすくなります。

基本的な使用例


以下の例では、else句を使用してデフォルトの動作を定義しています。

val day = "Holiday"
val activity = when (day) {
    "Monday" -> "Go to work"
    "Saturday", "Sunday" -> "Relax at home"
    else -> "Unplanned activity"
}
println(activity) // 出力: Unplanned activity

else句がない場合の問題


else句を設定しない場合、想定外の入力が与えられるとエラーが発生する可能性があります。

val value = 10
val result = when (value) {
    1 -> "One"
    2 -> "Two"
    // else句がないと、ここでエラーが発生する可能性がある
}

このコードは、valueが1や2以外の場合にコンパイルエラーとなります。

デフォルト値が不要な場合の工夫


else句を使わずにすべての条件を網羅するケースもありますが、その場合は列挙型や範囲条件を活用することが推奨されます。

enum class Color { RED, GREEN, BLUE }
val color = Color.RED
val description = when (color) {
    Color.RED -> "Stop"
    Color.GREEN -> "Go"
    Color.BLUE -> "Calm"
    // ここではelseが不要
}

まとめ


else句を使用することで、when文の条件を網羅し、安全で信頼性の高いコードを書くことができます。特に、予期しない入力や新しい条件が追加される可能性がある場合には、else句を設定しておくことが重要です。必要に応じて使い分けることで、より効率的なコードが実現します。

複数条件を一つにまとめる方法

Kotlinのwhen文では、複数の条件を効率的にまとめて処理することが可能です。同じ処理を実行する条件が複数ある場合、これを一つにまとめることで、コードが簡潔で分かりやすくなります。

複数条件をまとめる基本構文


複数の条件をカンマで区切ることで、1つの分岐にまとめられます。

val input = "B"
val result = when (input) {
    "A", "B", "C" -> "Group 1"
    "D", "E", "F" -> "Group 2"
    else -> "Unknown Group"
}
println(result) // 出力: Group 1

範囲を使用した条件のまとめ


数値や文字の範囲を指定することで、複数条件をさらに簡潔に表現できます。

val score = 85
val grade = when (score) {
    in 90..100 -> "A"
    in 80..89 -> "B"
    in 70..79 -> "C"
    else -> "F"
}
println(grade) // 出力: B

条件式を使用したまとめ方


条件式を使うことで、論理的に関連する条件をまとめることも可能です。

val number = -10
val description = when {
    number > 0 -> "Positive"
    number < 0 -> "Negative"
    else -> "Zero"
}
println(description) // 出力: Negative

具体例: 曜日の分類


以下の例では、平日と週末を分類する際に複数条件をまとめています。

val day = "Saturday"
val typeOfDay = when (day) {
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Weekday"
    "Saturday", "Sunday" -> "Weekend"
    else -> "Invalid day"
}
println(typeOfDay) // 出力: Weekend

複数条件をまとめる際の注意点

  1. 条件の重複を避ける
    条件が重複していると、意図しない結果を招く可能性があります。
  2. 条件の優先順位を考慮
    条件の順序が重要な場合、意図した通りに評価されるように記述します。
  3. 読みやすさを重視
    複数条件をまとめる際は、他の開発者が容易に理解できるコードを心がけます。

まとめ


Kotlinのwhen文では、カンマ、範囲、条件式を活用することで、複数の条件を効率的にまとめることができます。これにより、冗長なコードを回避し、スッキリとした条件分岐を実現できます。正確で読みやすいコードを書くために、これらの方法を適切に活用しましょう。

Kotlin特有のwhen文の応用例

Kotlinのwhen文は、単なる条件分岐を超えて、特有の機能を活用することで、さらに便利に使うことができます。以下では、Kotlinならではの応用例を紹介します。

スマートキャストを活用した型ごとの処理


Kotlinのスマートキャストを利用すれば、when文で値の型に応じた処理を簡潔に記述できます。

fun describeInput(input: Any): String {
    return when (input) {
        is Int -> "Input is an integer: $input"
        is String -> "Input is a string: $input"
        is Boolean -> if (input) "Input is true" else "Input is false"
        else -> "Unknown type"
    }
}
println(describeInput(42))       // 出力: Input is an integer: 42
println(describeInput("Kotlin")) // 出力: Input is a string: Kotlin
println(describeInput(true))     // 出力: Input is true

引数なしのwhen文で柔軟な条件分岐


引数を省略することで、複数の異なる条件を評価する柔軟な構文を記述できます。

val temperature = 25
val weather = when {
    temperature > 30 -> "Hot"
    temperature in 20..30 -> "Warm"
    temperature < 20 -> "Cold"
    else -> "Unknown"
}
println(weather) // 出力: Warm

列挙型(enum)の利用


列挙型と組み合わせることで、型安全かつ読みやすいコードを実現できます。

enum class TrafficLight {
    RED, YELLOW, GREEN
}

val light = TrafficLight.RED
val action = when (light) {
    TrafficLight.RED -> "Stop"
    TrafficLight.YELLOW -> "Caution"
    TrafficLight.GREEN -> "Go"
}
println(action) // 出力: Stop

when文を関数内で直接返す


when文を直接関数の戻り値として使用することで、さらに簡潔な記述が可能です。

fun getDiscountRate(day: String): Int = when (day) {
    "Monday" -> 10
    "Friday" -> 20
    else -> 5
}
println(getDiscountRate("Friday")) // 出力: 20

when文の条件を複雑なロジックで評価


when文内で関数を呼び出したり、条件式を記述することで、複雑なロジックを処理できます。

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

val number = 7
val description = when {
    isPrime(number) -> "$number is a prime number"
    number % 2 == 0 -> "$number is even"
    else -> "$number is odd"
}
println(description) // 出力: 7 is a prime number

まとめ


Kotlinのwhen文は、型安全性や簡潔性を活かして高度な条件分岐を実現できます。スマートキャストや引数なしの構文、列挙型の利用などを活用することで、さらに効率的で柔軟なプログラムを書くことができます。これらの応用例を取り入れて、Kotlinのwhen文を最大限に活用しましょう。

when文のネストを避けるテクニック

Kotlinでは、複雑な条件分岐が必要な場合、when文のネストが増えるとコードの可読性が低下します。しかし、適切なテクニックを用いることでネストを回避し、スッキリとしたコードを実現できます。

複数条件をカンマでまとめる


複数の条件をカンマでまとめることで、ネストを削減できます。

val day = "Sunday"
val activity = when (day) {
    "Saturday", "Sunday" -> "Relax at home"
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Go to work"
    else -> "Unknown activity"
}
println(activity) // 出力: Relax at home

条件式を活用する


引数なしのwhen文を使用し、条件式を直接記述することで、ネストを回避できます。

val temperature = 30
val weather = when {
    temperature > 35 -> "Too hot"
    temperature in 15..35 -> "Comfortable"
    temperature < 15 -> "Too cold"
    else -> "Unknown"
}
println(weather) // 出力: Comfortable

関数に分割する


複雑なロジックは関数に分割し、それをwhen文内で呼び出すことでネストを防ぎます。

fun isWeekend(day: String): Boolean = day == "Saturday" || day == "Sunday"

val day = "Saturday"
val activity = when {
    isWeekend(day) -> "Relax at home"
    else -> "Go to work"
}
println(activity) // 出力: Relax at home

列挙型を利用する


列挙型を活用することで、条件の意味を明確にしつつネストを減らすことができます。

enum class DayType {
    WEEKDAY, WEEKEND
}

fun getDayType(day: String): DayType = when (day) {
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> DayType.WEEKDAY
    "Saturday", "Sunday" -> DayType.WEEKEND
    else -> throw IllegalArgumentException("Invalid day")
}

val day = "Sunday"
val activity = when (getDayType(day)) {
    DayType.WEEKDAY -> "Go to work"
    DayType.WEEKEND -> "Relax at home"
}
println(activity) // 出力: Relax at home

when文を式として活用


when文を式として使用することで、複数の分岐結果を一度に返す構造を取り入れることが可能です。

val score = 85
val result = when {
    score >= 90 -> "Excellent"
    score >= 75 -> "Good"
    score >= 50 -> "Pass"
    else -> "Fail"
}
println(result) // 出力: Good

まとめ


when文のネストを避けるためには、カンマによる条件のまとめ、条件式や関数の活用、列挙型の利用などの方法があります。これらのテクニックを組み合わせることで、可読性が高く、保守性に優れたコードを実現できます。複雑なロジックも整理して記述することで、コードの理解と管理が容易になります。

演習問題:when文を使った課題解決

when文を使いこなすには、実際に手を動かして問題を解決することが効果的です。ここでは、Kotlinのwhen文を用いた課題を紹介します。問題を解いて、when文の使い方を深く理解しましょう。

問題1: 数値の評価


以下の条件に基づいて数値を評価するプログラムを作成してください。

  • 数値が0未満の場合は「Negative」を返す
  • 数値が0の場合は「Zero」を返す
  • 数値が0より大きい場合は「Positive」を返す


入力: -5
出力: Negative

fun evaluateNumber(number: Int): String {
    // ここにwhen文を使用して実装してください
}
println(evaluateNumber(-5)) // Negative
println(evaluateNumber(0))  // Zero
println(evaluateNumber(10)) // Positive

問題2: 曜日の分類


入力された曜日に応じて、「Weekday」または「Weekend」を返すプログラムを作成してください。

  • “Monday” ~ “Friday”: Weekday
  • “Saturday”、”Sunday”: Weekend


入力: "Sunday"
出力: Weekend

fun getDayType(day: String): String {
    // ここにwhen文を使用して実装してください
}
println(getDayType("Monday")) // Weekday
println(getDayType("Sunday")) // Weekend

問題3: 範囲による成績評価


スコア(0~100)に応じて成績を評価するプログラムを作成してください。

  • 90以上: “A”
  • 80~89: “B”
  • 70~79: “C”
  • 60~69: “D”
  • 59以下: “F”


入力: 85
出力: B

fun getGrade(score: Int): String {
    // ここにwhen文を使用して実装してください
}
println(getGrade(95)) // A
println(getGrade(72)) // C
println(getGrade(59)) // F

問題4: 型の判定


与えられた値の型に応じて以下の文字列を返すプログラムを作成してください。

  • Int型: “Integer”
  • String型: “String”
  • Boolean型: “Boolean”
  • それ以外: “Unknown”


入力: "Hello"
出力: String

fun identifyType(value: Any): String {
    // ここにwhen文を使用して実装してください
}
println(identifyType(42))       // Integer
println(identifyType("Hello"))  // String
println(identifyType(true))     // Boolean
println(identifyType(3.14))     // Unknown

問題5: BMI計算と分類


身長(cm)と体重(kg)を入力し、BMIを計算して以下のカテゴリを返すプログラムを作成してください。

  • BMI < 18.5: “Underweight”
  • BMI 18.5~24.9: “Normal weight”
  • BMI 25.0~29.9: “Overweight”
  • BMI >= 30: “Obese”

BMIの計算式:
BMI = 体重(kg) ÷ 身長(m)²


入力: 身長: 170, 体重: 70
出力: Normal weight

fun classifyBMI(heightCm: Double, weightKg: Double): String {
    val heightM = heightCm / 100
    val bmi = weightKg / (heightM * heightM)
    return when {
        // ここにwhen文を使用して実装してください
    }
}
println(classifyBMI(170.0, 70.0)) // Normal weight
println(classifyBMI(160.0, 50.0)) // Underweight
println(classifyBMI(180.0, 90.0)) // Overweight

まとめ


これらの問題を解くことで、when文の基礎から応用までを実践的に学ぶことができます。それぞれの課題を通じて、条件分岐や範囲、型判定などのスキルを磨きましょう。完成したコードは実際に動作させて結果を確認してください。

まとめ

本記事では、Kotlinのwhen文について、基本構造から応用例、そしてネスト回避のテクニックや演習問題を通じて詳しく解説しました。特に、when文を式として使用することで、条件分岐と値の返却を簡潔に記述できる利便性を理解いただけたかと思います。

when文を効果的に使うことで、コードの可読性や保守性が大幅に向上します。ぜひ本記事で紹介したテクニックや演習問題に取り組み、実践の中でその効果を体感してください。Kotlinの特徴を最大限に活かし、より効率的なプログラムを作成しましょう。

コメント

コメントする

目次