← Tất cả bài viết

Java Stream API: các thao tác thường dùng qua ví dụ

22/07/2026

Stream API (Java 8+) cho phép xử lý collection theo phong cách khai báo (declarative): mô tả muốn gì thay vì làm từng bước ra sao. Code ngắn và dễ đọc hơn vòng lặp thủ công.

Thao tác trung gian phổ biến

  • filter(predicate): giữ lại phần tử thoả điều kiện
  • map(fn): biến đổi mỗi phần tử
  • sorted(): sắp xếp
  • distinct(): loại trùng
  • limit(n)/skip(n): cắt/bỏ đầu

Thao tác kết thúc (terminal)

List<String> names = users.stream()
    .filter(u -> u.getAge() >= 18)
    .map(User::getName)
    .sorted()
    .collect(Collectors.toList());

Map<String, List<User>> byCity = users.stream()
    .collect(Collectors.groupingBy(User::getCity));

Bẫy cần tránh

  • Stream chỉ dùng một lần — dùng lại ném IllegalStateException
  • Đừng gây side-effect trong map/filter (sửa biến ngoài) — khó đoán với stream song song
  • parallelStream() không phải lúc nào cũng nhanh hơn — chỉ lợi với tập lớn và thao tác nặng, còn lại chi phí điều phối thread lấn át

Với vòng lặp đơn giản có side-effect, for-each truyền thống đôi khi rõ ràng hơn. Dùng stream cho pipeline biến đổi/gom dữ liệu.

👉 Dùng thử công cụ liên quan trên dev-hub: JSON Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.