When Expression trong Kotlin (Pattern Matching)
1. Giới thiệu
when trong Kotlin tương tự:
switchtrong Java/Cmatchtrong 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) // Wednesday4. 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.147. 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
- Sử dụng
whenthay vì chuỗiif-else ifdài whenexpression phải cóelsenếu không cover hết cases- Với sealed class/enum, không cần
else - Ưu tiên
whencho pattern matching phức tạp
📝 Tóm tắt
whenmạnh hơnswitchtrong 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
ischeck - Bắt buộc
elsecho when expression
Last updated on