✅ Boolean và Toán tử Logic
🎯 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
Phần tiêu đề “💡 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 = trueval isCompleted = false
if (isActive) { println("Đang hoạt động")}📝 Khai báo Boolean
Phần tiêu đề “📝 Khai báo Boolean”// Gán trực tiếpval isStudent = trueval hasPermission = false
// Từ biểu thức so sánhval age = 25val isAdult = age >= 18 // trueval canDrink = age >= 21 // true
// Từ methodval name = "Kotlin"val startsWithK = name.startsWith("K") // trueval isEmpty = name.isEmpty() // false⚖️ Toán tử So sánh (Comparison Operators)
Phần tiêu đề “⚖️ 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 = 10val b = 20
println(a == b) // falseprintln(a != b) // trueprintln(a < b) // trueprintln(a >= 10) // trueSo sánh String
Phần tiêu đề “So 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)
Phần tiêu đề “🔗 Toán tử Logic (Logical Operators)”AND (&&) - Và
Phần tiêu đề “AND (&&) - Và”Trả về true khi cả hai điều kiện đều true:
val age = 25val hasLicense = true
val canDrive = age >= 18 && hasLicenseprintln(canDrive) // true
// Truth table// true && true = true// true && false = false// false && true = false// false && false = falseOR (||) - Hoặc
Phần tiêu đề “OR (||) - Hoặc”Trả về true khi ít nhất một điều kiện true:
val isWeekend = trueval isHoliday = false
val dayOff = isWeekend || isHolidayprintln(dayOff) // true
// Truth table// true || true = true// true || false = true// false || true = true// false || false = falseNOT (!) - Phủ định
Phần tiêu đề “NOT (!) - Phủ định”Đảo ngược giá trị Boolean:
val isActive = true
println(!isActive) // falseprintln(!false) // true
val isEmpty = falseif (!isEmpty) { println("Có dữ liệu")}⚡ Short-circuit Evaluation
Phần tiêu đề “⚡ Short-circuit Evaluation”Kotlin dùng lazy evaluation cho && và ||:
// && dừng ngay khi gặp falseval result1 = false && expensiveFunction() // Không gọi expensiveFunction()
// || dừng ngay khi gặp trueval result2 = true || expensiveFunction() // Không gọi expensiveFunction()Ứng dụng thực tế:
// Kiểm tra null trước khi gọi methodval name: String? = nullval 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
Phần tiêu đề “🎯 Kết hợp nhiều điều kiện”Sử dụng dấu ngoặc để rõ ràng
Phần tiêu đề “Sử dụng dấu ngoặc để rõ ràng”val age = 25val hasTicket = trueval isVIP = false
// Không rõ ràngval canEnter = age >= 18 && hasTicket || isVIP
// Rõ ràng hơnval canEnter1 = (age >= 18 && hasTicket) || isVIP // trueval canEnter2 = age >= 18 && (hasTicket || isVIP) // trueThứ tự ưu tiên
Phần tiêu đề “Thứ tự ưu tiên”! (NOT) > && (AND) > || (OR)val result = !true || false && true// = false || false// = false🔧 Boolean methods hữu ích
Phần tiêu đề “🔧 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ệnprintln(list.any { it > 3 }) // true
// all - tất cả phần tử thỏa điều kiệnprintln(list.all { it > 0 }) // trueprintln(list.all { it > 3 }) // false
// none - không phần tử nào thỏa điều kiệnprintln(list.none { it > 10 }) // true🛠️ Thực hành
Phần tiêu đề “🛠️ 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
Phần tiêu đề “📱 Trong Android”// Visibility conditionbinding.errorText.isVisible = errorMessage.isNotBlank()
// Enable/disable buttonbinding.submitButton.isEnabled = emailEditText.text.isNotBlank() && passwordEditText.text.length >= 8
// Compound conditions trong whenval userState = when { !isNetworkAvailable -> UserState.Offline !isLoggedIn -> UserState.NotAuthenticated isAdmin -> UserState.Admin else -> UserState.RegularUser}⚠️ Lưu ý quan trọng
Phần tiêu đề “⚠️ Lưu ý quan trọng”✅ Checklist - Tự kiểm tra
Phần tiêu đề “✅ 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