Tổng quan
Cả Collection.stream().forEach() và Collection.forEach() đều được dùng để lặp qua các phần tử của collection, nhưng chúng có những khác biệt quan trọng về cách thức hoạt động, thứ tự thực thi, cơ chế khóa và xử lý ngoại lệ.
So sánh chi tiết
| Tiêu chí | Collection.forEach() | Collection.stream().forEach() |
|---|---|---|
| Cơ chế lặp | Sử dụng iterator của collection | Chuyển collection thành stream rồi lặp qua stream |
| Thứ tự thực thi | Luôn tuân theo thứ tự lặp của Iterable (nếu có) | Thứ tự không được xác định (undefined) |
| Cơ chế khóa (lock) | Nếu lặp qua collection đồng bộ, sẽ khóa đoạn collection và giữ khóa xuyên suốt các lần gọi | Không khóa collection |
| Xử lý sửa đổi cấu trúc | Ném ngay ConcurrentModificationException nếu có thay đổi cấu trúc trong lúc lặp |
Cũng ném ngoại lệ nhưng có thể bị trì hoãn (thrown later) |
Ví dụ Collection.stream().forEach()
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Ram");
list.add("TutorialPoints");
list.stream().forEach(System.out::print);
}
}
Ví dụ Collection.forEach()
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Ram");
list.add("TutorialPoints");
list.forEach(System.out::print);
}
}
Khi nào nên dùng phương pháp nào?
- Dùng
Collection.forEach()khi cần bảo toàn thứ tự lặp và làm việc với collection đồng bộ. - Dùng
Collection.stream().forEach()khi muốn tận dụng Stream API (filter, map, parallel processing) và không quan tâm thứ tự.