Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

แปลง Iterator เป็น Spliterator ใน Java 8+

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)

เมื่อไหร่ใช้?

  • เขียน custom data structure ที่ต้องการรองรับ Parallel Stream
  • Adapter pattern: wrap Iterator ให้ทำงานกับ Stream API
  • โดยทั่วไป ใช้ Collection.stream() โดยตรงดีกว่า (Spliterator สร้างให้อัตโนมัติ)
Flagค่าความหมาย
ORDERED0x00000010มีลำดับที่กำหนด (List, Array)
DISTINCT0x00000001ไม่มี duplicate (Set)
SORTED0x00000004เรียงตามลำดับ (TreeSet)
SIZED0x00000040รู้ขนาดแน่นอน
SUBSIZED0x00004000Sub-spliterators ก็รู้ขนาด
IMMUTABLE0x00000400Source ไม่เปลี่ยนแปลง
CONCURRENT0x00001000Thread-safe source
NONNULL0x00000100ไม่มี null elements