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ứccontinue: Bỏ qua phần còn lại và chuyển sang lần lặp tiếp theolabels: 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, 4Tì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, 9Lọ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@labelvscontinue@label
Tiếp theo: Hàm (Function)
Last updated on