Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วนลูป ArrayList ใน Java: 5 เทคนิค ตั้งแต่ Classic For ถึง Java 8 forEach

การวนลูป (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 operationsforEach() หรือ Stream API

บทความเกี่ยวข้อง