Boolean và Toán tử Logic trong Kotlin
🎯 Mục tiêu: Hiểu kiểu Boolean và các toán tử logic - nền tảng cho điều kiện và control flow.
💡 Khái niệm
Boolean là kiểu dữ liệu chỉ có 2 giá trị: true hoặc false. Đây là nền tảng cho mọi quyết định trong lập trình.
val isActive = true
val isCompleted = false
if (isActive) {
println("Đang hoạt động")
}📝 Khai báo Boolean
// Gán trực tiếp
val isStudent = true
val hasPermission = false
// Từ biểu thức so sánh
val age = 25
val isAdult = age >= 18 // true
val canDrink = age >= 21 // true
// Từ method
val name = "Kotlin"
val startsWithK = name.startsWith("K") // true
val isEmpty = name.isEmpty() // false⚖️ Toán tử So sánh (Comparison Operators)
Kết quả của so sánh luôn là Boolean:
| Toán tử | Ý nghĩa | Ví dụ | Kết quả |
|---|---|---|---|
== | Bằng | 5 == 5 | true |
!= | Khác | 5 != 3 | true |
> | Lớn hơn | 5 > 3 | true |
< | Nhỏ hơn | 3 < 5 | true |
>= | Lớn hơn hoặc bằng | 5 >= 5 | true |
<= | Nhỏ hơn hoặc bằng | 3 <= 5 | true |
val a = 10
val b = 20
println(a == b) // false
println(a != b) // true
println(a < b) // true
println(a >= 10) // trueSo sánh String
val s1 = "Kotlin"
val s2 = "Kotlin"
val s3 = "kotlin"
println(s1 == s2) // true (nội dung)
println(s1 == s3) // false (case-sensitive)
println(s1.equals(s3, ignoreCase = true)) // true🔗 Toán tử Logic (Logical Operators)
AND (&&) - Và
Trả về true khi cả hai điều kiện đều true:
val age = 25
val hasLicense = true
val canDrive = age >= 18 && hasLicense
println(canDrive) // true
// Truth table
// true && true = true
// true && false = false
// false && true = false
// false && false = falseOR (||) - Hoặc
Trả về true khi ít nhất một điều kiện true:
val isWeekend = true
val isHoliday = false
val dayOff = isWeekend || isHoliday
println(dayOff) // true
// Truth table
// true || true = true
// true || false = true
// false || true = true
// false || false = falseNOT (!) - Phủ định
Đảo ngược giá trị Boolean:
val isActive = true
println(!isActive) // false
println(!false) // true
val isEmpty = false
if (!isEmpty) {
println("Có dữ liệu")
}⚡ Short-circuit Evaluation
Kotlin dùng lazy evaluation cho && và ||:
// && dừng ngay khi gặp false
val result1 = false && expensiveFunction() // Không gọi expensiveFunction()
// || dừng ngay khi gặp true
val result2 = true || expensiveFunction() // Không gọi expensiveFunction()Ứng dụng thực tế:
// Kiểm tra null trước khi gọi method
val name: String? = null
val isLong = name != null && name.length > 10 // Safe!
// ❌ Nếu đổi thứ tự sẽ crash
// val isLong = name.length > 10 && name != null // NullPointerException!🎯 Kết hợp nhiều điều kiện
Sử dụng dấu ngoặc để rõ ràng
val age = 25
val hasTicket = true
val isVIP = false
// Không rõ ràng
val canEnter = age >= 18 && hasTicket || isVIP
// Rõ ràng hơn
val canEnter1 = (age >= 18 && hasTicket) || isVIP // true
val canEnter2 = age >= 18 && (hasTicket || isVIP) // true[!TIP] Luôn dùng dấu ngoặc
()khi kết hợp&&và||để code dễ đọc và tránh lỗi.
Thứ tự ưu tiên
! (NOT) > && (AND) > || (OR)val result = !true || false && true
// = false || false
// = false🔧 Boolean methods hữu ích
val list = listOf(1, 2, 3, 4, 5)
// any - ít nhất một phần tử thỏa điều kiện
println(list.any { it > 3 }) // true
// all - tất cả phần tử thỏa điều kiện
println(list.all { it > 0 }) // true
println(list.all { it > 3 }) // false
// none - không phần tử nào thỏa điều kiện
println(list.none { it > 10 }) // true🛠️ Thực hành
Bài tập 1: Kiểm tra năm nhuận
fun main() {
val year = 2024
// TODO: Năm nhuận nếu:
// - Chia hết cho 4 VÀ không chia hết cho 100
// - HOẶC chia hết cho 400
}Lời giải:
fun main() {
val year = 2024
val isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
println("Năm $year ${if (isLeapYear) "là" else "không là"} năm nhuận")
// Output: Năm 2024 là năm nhuận
}Bài tập 2: Kiểm tra đủ điều kiện đăng ký
fun main() {
val age = 20
val hasID = true
val hasParentConsent = false
// TODO: Đủ điều kiện nếu:
// - >= 18 tuổi VÀ có CMND
// - HOẶC < 18 tuổi VÀ có CMND VÀ có phụ huynh đồng ý
}Lời giải:
fun main() {
val age = 20
val hasID = true
val hasParentConsent = false
val isEligible = (age >= 18 && hasID) ||
(age < 18 && hasID && hasParentConsent)
println("Đủ điều kiện: $isEligible") // true
}Bài tập 3: Validate form đăng nhập
fun main() {
val username = "bumbii"
val password = "Kotlin123!"
// TODO: Valid nếu:
// - Username: 4-20 ký tự, không rỗng
// - Password: >= 8 ký tự, có chữ hoa, có số
}Lời giải:
fun main() {
val username = "bumbii"
val password = "Kotlin123!"
val isUsernameValid = username.isNotBlank() &&
username.length in 4..20
val isPasswordValid = password.length >= 8 &&
password.any { it.isUpperCase() } &&
password.any { it.isDigit() }
val isFormValid = isUsernameValid && isPasswordValid
println("Username valid: $isUsernameValid") // true
println("Password valid: $isPasswordValid") // true
println("Form valid: $isFormValid") // true
}📱 Trong Android
// Visibility condition
binding.errorText.isVisible = errorMessage.isNotBlank()
// Enable/disable button
binding.submitButton.isEnabled =
emailEditText.text.isNotBlank() &&
passwordEditText.text.length >= 8
// Compound conditions trong when
val userState = when {
!isNetworkAvailable -> UserState.Offline
!isLoggedIn -> UserState.NotAuthenticated
isAdmin -> UserState.Admin
else -> UserState.RegularUser
}⚠️ Lưu ý quan trọng
[!WARNING]
==so sánh nội dung,===so sánh reference:val a = "hello" val b = "hello" val c = String("hello".toCharArray()) println(a == b) // true (nội dung giống) println(a === b) // true (cùng string pool) println(a == c) // true (nội dung giống) println(a === c) // false (khác reference)
[!CAUTION] Không so sánh Float/Double bằng
==:val a = 0.1 + 0.2 val b = 0.3 println(a == b) // false! (do floating-point precision) // Dùng epsilon comparison val epsilon = 0.0001 println(kotlin.math.abs(a - b) < epsilon) // true
✅ Checklist - Tự kiểm tra
Sau bài học này, bạn có thể:
- Khai báo và sử dụng Boolean
- Sử dụng toán tử so sánh:
==,!=,<,>,<=,>= - Sử dụng toán tử logic:
&&,||,! - Hiểu short-circuit evaluation
- Kết hợp nhiều điều kiện với dấu ngoặc
- Phân biệt
==(equality) và===(identity)
Tiếp theo: Null Safety