Skip to Content
Kotlin📘 Ngôn ngữ KotlinWhen Expression (Pattern Matching)

When Expression trong Kotlin (Pattern Matching)

1. Giới thiệu

when trong Kotlin tương tự:

  • switch trong Java/C
  • match trong Python 3.10+
  • Nhưng mạnh mẽ hơn nhiều!

2. When cơ bản

val day = 3 when (day) { 1 -> println("Monday") 2 -> println("Tuesday") 3 -> println("Wednesday") 4 -> println("Thursday") 5 -> println("Friday") 6 -> println("Saturday") 7 -> println("Sunday") else -> println("Invalid day") }

3. When expression (Trả về giá trị)

val day = 3 val dayName = when (day) { 1 -> "Monday" 2 -> "Tuesday" 3 -> "Wednesday" 4 -> "Thursday" 5 -> "Friday" 6 -> "Saturday" 7 -> "Sunday" else -> "Invalid" } println(dayName) // Wednesday

4. When với nhiều điều kiện

val day = 6 when (day) { 1, 2, 3, 4, 5 -> println("Weekday") 6, 7 -> println("Weekend") else -> println("Invalid") }

5. When với ranges

val score = 85 when (score) { in 90..100 -> println("A") in 80..89 -> println("B") in 70..79 -> println("C") in 50..69 -> println("D") else -> println("F") }

6. When với type checking

fun describe(obj: Any): String = when (obj) { is String -> "String with length ${obj.length}" is Int -> "Integer: $obj" is Double -> "Double: $obj" is Boolean -> "Boolean: $obj" else -> "Unknown type" } println(describe("Hello")) // String with length 5 println(describe(42)) // Integer: 42 println(describe(3.14)) // Double: 3.14

7. When without argument

val age = 25 val hasLicense = true when { age < 18 -> println("Too young") !hasLicense -> println("No license") age >= 18 && hasLicense -> println("Can drive") else -> println("Unknown") }

8. When với block

val score = 95 val grade = when (score) { in 90..100 -> { println("Excellent!") "A" // Giá trị trả về } in 80..89 -> { println("Very good!") "B" } else -> { println("Keep trying!") "C" } }

9. When với enum

enum class Color { RED, GREEN, BLUE } fun getHex(color: Color) = when (color) { Color.RED -> "#FF0000" Color.GREEN -> "#00FF00" Color.BLUE -> "#0000FF" }

10. When với sealed class

sealed class Result { data class Success(val data: String) : Result() data class Error(val message: String) : Result() object Loading : Result() } fun handleResult(result: Result) = when (result) { is Result.Success -> println("Data: ${result.data}") is Result.Error -> println("Error: ${result.message}") is Result.Loading -> println("Loading...") }

11. So sánh với Python

// Kotlin when when (x) { 1 -> "One" 2 -> "Two" else -> "Other" }
# Python match (3.10+) match x: case 1: "One" case 2: "Two" case _: "Other"

12. Ví dụ thực tế - Menu

fun main() { println(""" === MENU === 1. Tạo tài khoản 2. Đăng nhập 3. Quên mật khẩu 4. Thoát """.trimIndent()) print("Chọn: ") val choice = readln().toIntOrNull() ?: 0 when (choice) { 1 -> { println("Đang tạo tài khoản...") createAccount() } 2 -> { println("Đang đăng nhập...") login() } 3 -> { println("Đang reset mật khẩu...") resetPassword() } 4 -> println("Tạm biệt!") else -> println("Lựa chọn không hợp lệ!") } } fun createAccount() { /* ... */ } fun login() { /* ... */ } fun resetPassword() { /* ... */ }

13. Best Practices

  1. Sử dụng when thay vì chuỗi if-else if dài
  2. when expression phải có else nếu không cover hết cases
  3. Với sealed class/enum, không cần else
  4. Ưu tiên when cho pattern matching phức tạp

📝 Tóm tắt

  • when mạnh hơn switch trong Java
  • Có thể trả về giá trị (expression)
  • Hỗ trợ: ranges, types, điều kiện phức tạp
  • when { } không cần argument cho điều kiện tự do
  • Smart casting với is check
  • Bắt buộc else cho when expression
Last updated on