Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa Collection.stream().forEach() và Collection.forEach() trong Java


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ự.