Cả hai đều dùng để duyệt (iterate) các phần tử của Collection, nhưng Spliterator (Splitable Iterator – Java 8) được thiết kế cho song song hóa (parallelism).
Bảng so sánh
| Tiêu chí | Iterator | Spliterator |
|---|---|---|
| Ra mắt | Java 1.2 | Java 8 |
| Mục đích | Duyệt tuần tự (sequential) | Duyệt tuần tự VÀ song song (parallel) |
| Phương thức chính | hasNext(), next(), remove(), forEachRemaining() | tryAdvance(), trySplit(), forEachRemaining(), estimateSize(), characteristics() |
| Chia tách (Split) | Không hỗ trợ | trySplit() trả về Spliterator mới覆盖 một phần elements |
| Duyệt bulk | Không (phải loop next()) | Có (forEachRemaining tối ưu) |
| Iterator type | External Iterator (client điều khiển loop) | Internal Iterator (client cung cấp action, Spliterator điều khiển) |
| Characteristics | Không có | ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT, SUBSIZED – giúp Stream tối ưu |
| Stream integration | Không trực tiếp | Nền tảng của Stream API (collection.spliterator() → Stream) |
Phương thức then chốt của Spliterator
boolean tryAdvance(Consumer super T> action): Thử xử lý 1 element. Trả về true nếu còn element. Tương đươnghasNext + next.Spliterator: Pha chia (split) thành 2 Spliterator để xử lý song song. Trả về null nếu không chia được (quá ít element).trySplit() long estimateSize(): Ước lượng số element còn lại.int characteristics(): Trả về bitmask đặc tính (ORDERED, SIZED...).
Ví dụ Spliterator cơ bản
import java.util.*;
import java.util.stream.*;
public class SpliteratorDemo {
public static void main(String[] args) {
List list = Arrays.asList(78, 10, 20, 30, 40, 50, 60, 70);
Spliterator spliterator = list.spliterator();
Spliterator split = spliterator.trySplit(); // Chia ~ nửa
System.out.println("First half:");
spliterator.forEachRemaining(System.out::println); // 40,50,60,70 (phần sau)
System.out.println("Second half (split off):");
split.forEachRemaining(System.out::println); // 78,10,20,30 (phần trước)
// Dùng với Stream (parallel tự động dùng trySplit)
list.parallelStream()
.filter(n -> n > 25)
.forEach(System.out::println);
}
}
Characteristics quan trọng
| Characteristic | Ý nghĩa | Tác động Stream |
|---|---|---|
| ORDERED | Phần tử có thứ tự (List, array) | Giữ thứ tự trong parallel stream (có overhead) |
| DISTINCT | Không trùng lặp (Set) | Tối ưu distinct() |
| SORTED | Đã sắp xếp | Tối ưu sorted() |
| SIZED | estimateSize() chính xác | Chia đều workload |
| SUBSIZED | Các split cũng SIZED | Chia đệ quy đều |
| NONNULL | Không có null | Bỏ qua null check |
| IMMUTABLE | Nguồn không đổi | An toàn parallel |
| CONCURRENT | Thread-safe (ConcurrentHashMap) | Cho phép concurrent modification |
Khi nào dùng Spliterator trực tiếp?
- Viết custom Spliterator cho cấu trúc dữ liệu riêng (tree, graph, database cursor).
- Cần kiểm soát chi tiết việc chia task cho parallel processing.
- Tối ưu hiệu năng cho Stream pipeline phức tạp.
Trong 99% trường hợp ứng dụng, dùng collection.stream() hoặc collection.parallelStream() – Spliterator được quản lý ngầm.