ภาพรวม
Kotlin มี forEach สำหรับวนลูป แต่ไม่ให้ Index โดยตรง ต้องใช้ forEachIndexed หรือ withIndex() แทน
วิธีที่ 1: forEachIndexed() - แนะนำ
fun main() {
val subjects = listOf("Java", "Kotlin", "JS", "C")
subjects.forEachIndexed { index, element ->
println("index = $index, item = $element")
}
}
ผลลัพธ์
index = 0, item = Java
index = 1, item = Kotlin
index = 2, item = JS
index = 3, item = C
วิธีที่ 2: withIndex() + for Loop
fun main() {
val subjects = listOf("Java", "Kotlin", "JS", "C")
for ((index, value) in subjects.withIndex()) {
println("The subject of $index is $value")
}
}
ผลลัพธ์
The subject of 0 is Java
The subject of 1 is Kotlin
The subject of 2 is JS
The subject of 3 is C
วิธีที่ 3: ใช้ withIndex() กับ forEach (Less Common)
subjects.withIndex().forEach { (index, value) ->
println("$index: $value")
}
การปรับแต่ง Index เริ่มต้น (Custom Start Index)
fun main() {
val subjects = listOf("Java", "Kotlin", "JS", "C")
// เริ่มนับจาก 1 แทน 0
subjects.withIndex().forEach { (index, value) ->
println("${index + 1}. $value")
}
// หรือใช้ forEachIndexed กับ offset
subjects.forEachIndexed { index, value ->
println("${index + 1}. $value")
}
}
ตารางเปรียบเทียบ
| วิธี | Syntax | เหมาะสำหรับ | Return |
|---|---|---|---|
| forEachIndexed | .forEachIndexed { i, v -> } | การทำงานแบบ Inline/Functional | Unit |
| withIndex + for | for ((i,v) in list.withIndex()) | ต้องการ break/continue, 複雑 Logic | Unit |
| withIndex + forEach | .withIndex().forEach { (i,v) -> } | Functional Chain | Unit |
ข้อสังเกต
forEachไม่มี Index - ใช้forEachIndexedแทนwithIndex()คืนค่าIterableใช้ได้กับทุก Iterable> - Index เริ่มต้นที่ 0 เสมอ - ปรับเองด้วย
index + offset - Performance:
forEachIndexedและfor loopเร็วกว่าwithIndex().forEach()เล็กน้อย (ไม่สร้าง Wrapper Object)