Skip to Content
Kotlin📘 Ngôn ngữ Kotlin⏹️ Break và Continue

Break và Continue trong Kotlin

🎯 Mục tiêu: Nắm vững cách điều khiển luồng vòng lặp với break, continue, và đặc biệt là labels - tính năng mạnh mẽ của Kotlin.


💡 Khái niệm

  • break: Thoát khỏi vòng lặp ngay lập tức
  • continue: Bỏ qua phần còn lại và chuyển sang lần lặp tiếp theo
  • labels: Cho phép break/continue vòng lặp bên ngoài (nested loops)

📝 break

Cú pháp cơ bản

for (i in 1..10) { if (i == 5) { break // Thoát khi i = 5 } println(i) } // Output: 1, 2, 3, 4

Tìm kiếm trong danh sách

val numbers = listOf(1, 3, 5, 7, 9, 2, 4) var found = false for (num in numbers) { if (num % 2 == 0) { println("Tìm thấy số chẵn đầu tiên: $num") found = true break } } if (!found) { println("Không tìm thấy số chẵn") }

🔄 continue

Cú pháp cơ bản

for (i in 1..10) { if (i % 2 == 0) { continue // Bỏ qua số chẵn } println(i) } // Output: 1, 3, 5, 7, 9

Lọc và xử lý

val names = listOf("Alice", "", "Bob", " ", "Charlie") for (name in names) { if (name.isBlank()) { continue // Bỏ qua tên rỗng } println("Hello, ${name.trim()}!") }

🏷️ Labels - Tính năng đặc biệt của Kotlin

Labels cho phép break/continue vòng lặp bên ngoài trong nested loops:

Cú pháp

labelName@ for (...) { for (...) { break@labelName // Thoát vòng lặp được đánh dấu continue@labelName // Tiếp tục vòng lặp được đánh dấu } }

break với label

outer@ for (i in 1..5) { for (j in 1..5) { if (i * j > 10) { println("Breaking at i=$i, j=$j") break@outer // Thoát cả 2 vòng lặp } print("${i * j} ") } println() }

continue với label

outer@ for (i in 1..3) { for (j in 1..3) { if (j == 2) { continue@outer // Bỏ qua và tiếp tục vòng ngoài } println("i=$i, j=$j") } } // Output: // i=1, j=1 // i=2, j=1 // i=3, j=1

🎯 Use Cases thực tế

Tìm kiếm trong ma trận

val matrix = arrayOf( intArrayOf(1, 2, 3), intArrayOf(4, 5, 6), intArrayOf(7, 8, 9) ) val target = 5 var found = false search@ for (i in matrix.indices) { for (j in matrix[i].indices) { if (matrix[i][j] == target) { println("Tìm thấy $target tại [$i][$j]") found = true break@search } } }

Validate input

val validInputs = mutableListOf<Int>() val inputs = listOf("10", "abc", "20", "", "30", "-5") for (input in inputs) { val number = input.toIntOrNull() if (number == null) { println("'$input' không phải số, bỏ qua") continue } if (number < 0) { println("$number là số âm, bỏ qua") continue } validInputs.add(number) } println("Valid inputs: $validInputs") // [10, 20, 30]

🛠️ Thực hành

Bài tập 1: Tìm số nguyên tố đầu tiên > 100

fun main() { // TODO: Tìm và in số nguyên tố đầu tiên lớn hơn 100 }

Lời giải:

fun main() { for (n in 101..Int.MAX_VALUE) { var isPrime = true for (i in 2..kotlin.math.sqrt(n.toDouble()).toInt()) { if (n % i == 0) { isPrime = false break } } if (isPrime) { println("Số nguyên tố đầu tiên > 100: $n") break } } // Output: 101 }

Bài tập 2: In các số không chia hết cho 3 và 5

fun main() { // TODO: In các số từ 1-30 không chia hết cho 3 và 5 }

Lời giải:

fun main() { println("Số không chia hết cho 3 và 5 (1-30):") for (i in 1..30) { if (i % 3 == 0 || i % 5 == 0) { continue } print("$i ") } // 1 2 4 7 8 11 13 14 16 17 19 22 23 26 28 29 }

Bài tập 3: Tìm cặp số có tổng = target

fun main() { val numbers = listOf(2, 7, 11, 15, 3, 6) val target = 9 // TODO: Tìm cặp số có tổng = 9 }

Lời giải:

fun main() { val numbers = listOf(2, 7, 11, 15, 3, 6) val target = 9 search@ for (i in numbers.indices) { for (j in i + 1 until numbers.size) { if (numbers[i] + numbers[j] == target) { println("Cặp số: ${numbers[i]} + ${numbers[j]} = $target") break@search } } } }

📱 Trong Android

// Tìm view trong hierarchy fun findViewByTag(parent: ViewGroup, tag: String): View? { for (i in 0 until parent.childCount) { val child = parent.getChildAt(i) if (child.tag == tag) { return child } if (child is ViewGroup) { findViewByTag(child, tag)?.let { return it } } } return null } // Parse data, skip invalid val validUsers = mutableListOf<User>() for (jsonUser in jsonArray) { val name = jsonUser.optString("name") if (name.isBlank()) continue val age = jsonUser.optInt("age", -1) if (age < 0) continue validUsers.add(User(name, age)) }

⚠️ Lưu ý quan trọng

[!TIP] Labels thường dùng cho nested loops:

// Không có label - chỉ break vòng trong for (i in 1..3) { for (j in 1..3) { if (condition) break // Chỉ thoát vòng j } } // Có label - break vòng ngoài outer@ for (i in 1..3) { for (j in 1..3) { if (condition) break@outer // Thoát cả 2 } }

[!WARNING] Tránh lạm dụng labels: Nếu code có quá nhiều labels, cân nhắc tách thành functions.


✅ Checklist - Tự kiểm tra

Sau bài học này, bạn có thể:

  • Sử dụng break để thoát vòng lặp
  • Sử dụng continue để bỏ qua iteration
  • Hiểu và sử dụng labels cho nested loops
  • Biết khi nào dùng break@label vs continue@label

Tiếp theo: Hàm (Function)

Last updated on