การวนลูป (Iterate) ArrayList เป็นพื้นฐานที่สำคัญใน Java บทความนี้รวบรวม 5 วิธีหลัก ตั้งแต่ Java แบบเก่าจนถึง Java 8+
เตรียมข้อมูลทดสอบ
import java.util.ArrayList;
import java.util.List;
List<String> fruitBasket = new ArrayList<>();
fruitBasket.add("Apple");
fruitBasket.add("Banana");
fruitBasket.add("Pear");
fruitBasket.add("Mango");
1. Classic For Loop (ดัชนี)
for (int i = 0; i < fruitBasket.size(); i++) {
System.out.println(fruitBasket.get(i));
}
✅ ใช้เมื่อ: ต้องการดัชนี (index), ต้องการลบข้อมูลระหว่างลูป, หรือต้องการควบคุมการวนซ้ำแบบละเอียด
2. Enhanced For Loop (For-Each) - Java 5+
for (String fruit : fruitBasket) {
System.out.println(fruit);
}
✅ แนะนำสำหรับการอ่านอย่างเดียว - อ่านง่าย สะดวก ไม่ต้องจัดการ index
⚠️ ข้อจำกัด: ไม่สามารถลบ/เพิ่ม element ระหว่างลูปได้ (จะโยน ConcurrentModificationException)
3. Iterator (ปลอดภัยสำหรับการลบข้อมูล)
import java.util.Iterator;
Iterator<String> iterator = fruitBasket.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
// ลบข้อมูลระหว่างลูปได้ปลอดภัย
if ("Banana".equals(fruit)) {
iterator.remove(); // วิธีเดียวที่ปลอดภัย
}
}
✅ ใช้เมื่อ: ต้องการลบ element ระหว่างการวนลูป
4. While Loop
int i = 0;
while (i < fruitBasket.size()) {
System.out.println(fruitBasket.get(i));
i++;
}
✅ ใช้เมื่อ: เงื่อนไขการหยุดซับซ้อนกว่าแค่ index
5. forEach() + Lambda - Java 8+
// Method reference
fruitBasket.forEach(System.out::println);
// Lambda expression
fruitBasket.forEach(fruit -> System.out.println(fruit));
// หลายคำสั่ง
fruitBasket.forEach(fruit -> {
System.out.println("Fruit: " + fruit);
System.out.println("Length: " + fruit.length());
});
✅ ใช้เมื่อ: เขียนแบบ Functional Style, ต้องการ chain กับ stream operations
Bonus: Stream API (Java 8+) - กรอง/แปลงข้อมูลพร้อมวนลูป
import java.util.stream.Collectors;
// กรองและแปลงพร้อมกัน
List<String> upperCaseFruits = fruitBasket.stream()
.filter(f -> f.startsWith("A")) // กรองเฉพาะขึ้นต้นด้วย A
.map(String::toUpperCase) // แปลงเป็นตัวพิมพ์ใหญ่
.collect(Collectors.toList()); // รวมเป็น List ใหม่
upperCaseFruits.forEach(System.out::println); // APPLE
สรุป: การเลือกใช้
| สถานการณ์ | วิธีที่แนะนำ |
|---|---|
| อ่านอย่างเดียว โค้ดสะอาด | Enhanced For Loop (For-Each) |
| ต้องการ index / ลบข้อมูลระหว่างลูป | Classic For Loop หรือ Iterator |
| ลบข้อมูลระหว่างลูป (ปลอดภัย) | Iterator.remove() |
| Functional Style / Chain operations | forEach() หรือ Stream API |