Bỏ qua để đến nội dung

✅ 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.


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")
}

// 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

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) // true
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

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 = false

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 = false

Đả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")
}

Kotlin dùng lazy evaluation cho &&||:

// && 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!

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
! (NOT) > && (AND) > || (OR)
val result = !true || false && true
// = false || false
// = false

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

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
}

// 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
}


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