Vòng lặp for trong Kotlin
🎯 Mục tiêu: Nắm vững vòng lặp for với ranges, progressions, indices, và các kỹ thuật duyệt collections.
💡 Khái niệm
Vòng lặp for trong Kotlin khác so với Java. Kotlin không có for loop truyền thống for(i=0; i<n; i++), thay vào đó sử dụng for-in để duyệt qua các iterable.
for (item in collection) {
println(item)
}📝 Duyệt qua Ranges
Range cơ bản với ..
// 1 đến 5 (bao gồm cả 5)
for (i in 1..5) {
println(i) // 1, 2, 3, 4, 5
}Range không bao gồm cuối với until
// 1 đến 4 (không bao gồm 5)
for (i in 1 until 5) {
println(i) // 1, 2, 3, 4
}Đếm ngược với downTo
for (i in 5 downTo 1) {
println(i) // 5, 4, 3, 2, 1
}Bước nhảy với step
// Đếm lên, bước 2
for (i in 0..10 step 2) {
println(i) // 0, 2, 4, 6, 8, 10
}
// Đếm xuống, bước 3
for (i in 15 downTo 0 step 3) {
println(i) // 15, 12, 9, 6, 3, 0
}📋 Duyệt qua Collections
List
val fruits = listOf("Apple", "Banana", "Orange")
for (fruit in fruits) {
println(fruit)
}Với index sử dụng indices
val fruits = listOf("Apple", "Banana", "Orange")
for (i in fruits.indices) {
println("$i: ${fruits[i]}")
}
// 0: Apple
// 1: Banana
// 2: OrangeVới index sử dụng withIndex()
val fruits = listOf("Apple", "Banana", "Orange")
for ((index, fruit) in fruits.withIndex()) {
println("$index: $fruit")
}🔤 Duyệt qua String
val word = "Kotlin"
for (char in word) {
println(char) // K, o, t, l, i, n
}
// Với index
for ((i, c) in word.withIndex()) {
println("$i: $c")
}🗺️ Duyệt qua Map
val scores = mapOf("Alice" to 95, "Bob" to 87, "Charlie" to 92)
for ((name, score) in scores) {
println("$name: $score điểm")
}🔄 Repeat
Khi chỉ cần lặp n lần mà không cần biến đếm:
repeat(5) {
println("Hello!")
}
// Với index
repeat(5) { index ->
println("Lần ${index + 1}")
}🔀 forEach (Functional style)
val numbers = listOf(1, 2, 3, 4, 5)
// forEach
numbers.forEach { println(it) }
// forEachIndexed
numbers.forEachIndexed { index, number ->
println("$index: $number")
}🛠️ Thực hành
Bài tập 1: In bảng cửu chương
fun main() {
val n = 7
// TODO: In bảng cửu chương của số n
}Lời giải:
fun main() {
val n = 7
println("=== Bảng cửu chương $n ===")
for (i in 1..10) {
println("$n x $i = ${n * i}")
}
}Bài tập 2: Tính tổng số chẵn
fun main() {
// TODO: Tính tổng các số chẵn từ 1 đến 100
}Lời giải:
fun main() {
var sum = 0
for (i in 2..100 step 2) {
sum += i
}
println("Tổng số chẵn từ 1-100: $sum") // 2550
// Hoặc functional style
val sum2 = (2..100 step 2).sum()
println("Tổng (functional): $sum2")
}Bài tập 3: Đảo ngược chuỗi
fun main() {
val text = "Kotlin"
// TODO: In chuỗi đảo ngược
}Lời giải:
fun main() {
val text = "Kotlin"
// Cách 1: for loop
var reversed = ""
for (i in text.lastIndex downTo 0) {
reversed += text[i]
}
println(reversed) // niltoK
// Cách 2: reversed()
println(text.reversed()) // niltoK
}Bài tập 4: In tam giác sao
fun main() {
val height = 5
// TODO: In tam giác sao
// *
// **
// ***
// ****
// *****
}Lời giải:
fun main() {
val height = 5
for (i in 1..height) {
println("*".repeat(i))
}
// Hoặc
for (i in 1..height) {
for (j in 1..i) {
print("*")
}
println()
}
}📱 Trong Android
// RecyclerView data binding
items.forEachIndexed { index, item ->
Log.d("Adapter", "Position $index: ${item.name}")
}
// Populate spinner
val options = listOf("Option 1", "Option 2", "Option 3")
for ((index, option) in options.withIndex()) {
spinner.adapter.add(option)
}
// Animate views
for (i in 0 until container.childCount) {
val child = container.getChildAt(i)
child.animate()
.alpha(1f)
.setStartDelay(i * 100L)
.start()
}⚠️ Lưu ý quan trọng
[!WARNING] Kotlin không có for loop truyền thống:
// ❌ Không tồn tại trong Kotlin // for (int i = 0; i < 10; i++) { } // ✅ Dùng range for (i in 0 until 10) { }
[!TIP] Ưu tiên forEach khi không cần break/continue:
// Functional style - sạch đẹp hơn numbers.forEach { println(it) } // Cần break/continue? Dùng for-in for (num in numbers) { if (num > 10) break println(num) }
✅ Checklist - Tự kiểm tra
Sau bài học này, bạn có thể:
- Sử dụng
..vàuntilcho ranges - Sử dụng
downTođể đếm ngược - Sử dụng
stepđể thay đổi bước nhảy - Duyệt collections với
for (item in collection) - Lấy index với
indiceshoặcwithIndex() - Sử dụng
repeat(n)cho lặp đơn giản - Sử dụng
forEachcho functional style
Tiếp theo: Vòng lặp while
Last updated on