package spliterator; import java.util.Spliterator; import java.util.function.Consumer; import java.util.stream.StreamSupport; public class ArraySpliterator implements Spliterator{ A[] as; int start; int end; public ArraySpliterator(A[] as) { this(as,0,as.length); } public ArraySpliterator(A[] as, int start, int end) { super(); this.as = as; this.start = start; this.end = end; } @Override public boolean tryAdvance(Consumer action) { if (start>=end) return false; action.accept(as[start++]); return true; } @Override public Spliterator trySplit() { var n = end-start; if (n<4) return null; var middle = start+n/2; var result = new ArraySpliterator(as, middle, end); end = middle; return result; } @Override public long estimateSize() { return end-start; } @Override public int characteristics() { return 0; } public static void main(String[] args) { String[] xs = {"Das","Pferd","frisst","keinen","Gurkensalat"}; var split1 = new ArraySpliterator<>(xs); // while(split1.tryAdvance(x->System.out.println(x.toUpperCase()))); var stream1 = StreamSupport.stream(split1, false); stream1.filter(x->x.length()>3).forEach(x->System.out.println(x)); Integer[] is = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; var stream2 = StreamSupport.stream(new ArraySpliterator<>(is),true); stream2.forEach(i -> System.out.print(i+" ")); } }