Kotlinを勉強していて、気になったことのメモ
今回はwhen文の使い方について
最新のJavaではできるようになったこともあるが、ちょっと前の Java を触っていた身からすると、すごく柔軟に感じた
when文
式として使い、戻り値を返すことができる
val x = 2 val result = when (x) { 1 -> "One" 2 -> "Two" 3 -> "Three" else -> "Unknown" } println(result) // "Two" と出力
条件式でチェックすることができる
val x = 15 when { x % 2 == 0 -> println("x is even") x % 2 != 0 -> println("x is odd") }
is 演算子を使って型をチェックすることができる
fun checkType(obj: Any) { when (obj) { is String -> println("It's a String: $obj") is Int -> println("It's an Integer: $obj") is Boolean -> println("It's a Boolean: $obj") else -> println("Unknown type") } } checkType("Hello") // It's a String: Hello checkType(123) // It's an Integer: 123 checkType(true) // It's a Boolean: true
範囲のマッチング
val x = 25 when (x) { in 1..10 -> println("x is between 1 and 10") in 11..20 -> println("x is between 11 and 20") in 21..30 -> println("x is between 21 and 30") else -> println("x is outside the range") }
when 文の中で型チェックを行った後、その変数はスマートキャストされ、明示的なキャストが不要になる
fun smartCastExample(obj: Any) { when (obj) { is String -> println("String of length ${obj.length}") is Int -> println("Square of number is ${obj * obj}") else -> println("Unsupported type") } } smartCastExample("Kotlin") // String of length 6 smartCastExample(5) // Square of number is 25
関数型プログラミングへの応用
whenを式として使って、戻り値を返すならば、関数型プログラミングに応用できると思った
そのあたりのざっくりまとめ
- 式としての利用:
whenは値を返す式として機能するので、副作用のない関数(pure function)を簡潔に書ける
- パターンマッチング:
- 式の合成:
whenを式として他の関数と組み合わせることで、処理を合成するスタイルを取りやすくなる
例: when を使った関数型プログラミング
1. パターンマッチングによるデータ変換
データクラスやシールクラスのインスタンスに対して、when を使って異なる処理を行う
関数型プログラミングでは、データ型ごとの処理をパターンマッチングで実行することが多く、when はこの目的に適している
sealed class Shape data class Circle(val radius: Double) : Shape() data class Rectangle(val width: Double, val height: Double) : Shape() fun calculateArea(shape: Shape): Double { return when (shape) { is Circle -> Math.PI * shape.radius * shape.radius is Rectangle -> shape.width * shape.height } } fun main() { val circle = Circle(3.0) val rectangle = Rectangle(4.0, 5.0) println(calculateArea(circle)) // 出力: 28.274333882308138 println(calculateArea(rectangle)) // 出力: 20.0 }
この例では、when は型に基づいて Circle と Rectangle の処理を分けている
シールクラス(sealed class)を使うことで、このパターンマッチングがコンパイル時に完全に安全に行うことができる
2. 関数合成のための when
関数型プログラミングでは関数を合成して新しい関数を作ることがよくある
when を用いることで、処理の流れを式としてまとめることができる
fun processInput(input: Int): String { return when { input < 0 -> "Negative" input == 0 -> "Zero" input > 0 -> "Positive" else -> "Unknown" } } fun applyTransformation(input: Int): String { return processInput(input).uppercase() } fun main() { println(applyTransformation(-10)) // 出力: "NEGATIVE" println(applyTransformation(0)) // 出力: "ZERO" println(applyTransformation(42)) // 出力: "POSITIVE" }
この例では、when で条件分岐を行い、結果をさらに別の関数で変換している