Iterator vs Spliterator
- Iterator: Sequential traversal เท่านั้น
- Spliterator: สามารถ split ได้ สำหรับ parallel processing (Stream API)
การแปลง: Spliterators.spliteratorUnknownSize()
import java.util.*;
import java.util.stream.*;
public class Demo {
public static Spliterator toSpliterator(Iterator iterator) {
// characteristics = 0 (no special properties known)
return Spliterators.spliteratorUnknownSize(iterator, 0);
}
// ถ้ารู้ขนาด (SIZED) และ SUBSIZED
public static Spliterator toSpliteratorSized(Iterator iterator, long size) {
return Spliterators.spliterator(iterator, size, Spliterator.SIZED | Spliterator.SUBSIZED);
}
public static void main(String[] args) {
Iterator iter = Arrays.asList(56, 78, 99, 32, 100, 234).iterator();
Spliterator spliter = toSpliterator(iter);
System.out.println("Characteristics: " + spliter.characteristics());
// 0 = UNKNOWN (ไม่รู้ขนาด, ไม่ sorted, ไม่ distinct, ไม่ immutable)
// ใช้กับ Stream
Stream stream = StreamSupport.stream(spliter, false); // false = sequential
System.out.println("Stream values: " + stream.collect(Collectors.toList()));
// Parallel stream (Spliterator ต้อง splittable)
Spliterator spliter2 = toSpliterator(Arrays.asList(1,2,3,4,5,6,7,8).iterator());
Stream parallelStream = StreamSupport.stream(spliter2, true); // true = parallel
System.out.println("Parallel sum: " + parallelStream.mapToInt(i -> i).sum());
}
}
ผลลัพธ์
Characteristics: 0
Stream values: [56, 78, 99, 32, 100, 234]
Parallel sum: 36
Spliterator Characteristics (Bit Flags)
| Flag | ค่า | ความหมาย |
| ORDERED | 0x00000010 | มีลำดับที่กำหนด (List, Array) |
| DISTINCT | 0x00000001 | ไม่มี duplicate (Set) |
| SORTED | 0x00000004 | เรียงตามลำดับ (TreeSet) |
| SIZED | 0x00000040 | รู้ขนาดแน่นอน |
| SUBSIZED | 0x00004000 | Sub-spliterators ก็รู้ขนาด |
| IMMUTABLE | 0x00000400 | Source ไม่เปลี่ยนแปลง |
| CONCURRENT | 0x00001000 | Thread-safe source |
| NONNULL | 0x00000100 | ไม่มี null elements |
เมื่อไหร่ใช้?
- เขียน custom data structure ที่ต้องการรองรับ Parallel Stream
- Adapter pattern: wrap Iterator ให้ทำงานกับ Stream API
- โดยทั่วไป ใช้ Collection.stream() โดยตรงดีกว่า (Spliterator สร้างให้อัตโนมัติ)