< prev index next >

src/java.base/share/classes/java/util/stream/StreamSpliterators.java

Print this page

        

@@ -154,10 +154,11 @@
                 if (finished)
                     return false;
 
                 init();
                 initPartialTraversalState();
+                initPusher();
                 nextToConsume = 0;
                 bufferSink.begin(spliterator.getExactSizeIfKnown());
                 return fillBuffer();
             }
             else {

@@ -174,25 +175,39 @@
 
         /**
          * Invokes the shape-specific constructor with the provided arguments
          * and returns the result.
          */
-        abstract AbstractWrappingSpliterator<P_IN, P_OUT, ?> wrap(Spliterator<P_IN> s);
+        abstract AbstractWrappingSpliterator<P_IN, P_OUT, T_BUFFER> wrap(Spliterator<P_IN> s);
 
         /**
          * Initializes buffer, sink chain, and pusher for a shape-specific
          * implementation.
          */
         abstract void initPartialTraversalState();
 
+        void initPusher() {
+            pusher = () -> spliterator.tryAdvance(bufferSink);
+        }
+
         @Override
         public Spliterator<P_OUT> trySplit() {
             if (isParallel && !finished) {
                 init();
 
                 Spliterator<P_IN> split = spliterator.trySplit();
-                return (split == null) ? null : wrap(split);
+                if (split == null)
+                    return null;
+                AbstractWrappingSpliterator<P_IN, P_OUT, T_BUFFER> prefix = wrap(split);
+                if (buffer != null) {
+                    prefix.buffer = buffer;
+                    prefix.bufferSink = bufferSink;
+                    prefix.nextToConsume = nextToConsume;
+                    prefix.initPusher();
+                    buffer = null;
+                }
+                return prefix;
             }
             else
                 return null;
         }
 

@@ -289,11 +304,10 @@
         @Override
         void initPartialTraversalState() {
             SpinedBuffer<P_OUT> b = new SpinedBuffer<>();
             buffer = b;
             bufferSink = ph.wrapSink(b::accept);
-            pusher = () -> spliterator.tryAdvance(bufferSink);
         }
 
         @Override
         public boolean tryAdvance(Consumer<? super P_OUT> consumer) {
             Objects.requireNonNull(consumer);

@@ -333,20 +347,19 @@
                                boolean parallel) {
             super(ph, spliterator, parallel);
         }
 
         @Override
-        AbstractWrappingSpliterator<P_IN, Integer, ?> wrap(Spliterator<P_IN> s) {
+        AbstractWrappingSpliterator<P_IN, Integer, SpinedBuffer.OfInt> wrap(Spliterator<P_IN> s) {
             return new IntWrappingSpliterator<>(ph, s, isParallel);
         }
 
         @Override
         void initPartialTraversalState() {
             SpinedBuffer.OfInt b = new SpinedBuffer.OfInt();
             buffer = b;
             bufferSink = ph.wrapSink((Sink.OfInt) b::accept);
-            pusher = () -> spliterator.tryAdvance(bufferSink);
         }
 
         @Override
         public Spliterator.OfInt trySplit() {
             return (Spliterator.OfInt) super.trySplit();

@@ -391,20 +404,19 @@
                                 boolean parallel) {
             super(ph, spliterator, parallel);
         }
 
         @Override
-        AbstractWrappingSpliterator<P_IN, Long, ?> wrap(Spliterator<P_IN> s) {
+        AbstractWrappingSpliterator<P_IN, Long, SpinedBuffer.OfLong> wrap(Spliterator<P_IN> s) {
             return new LongWrappingSpliterator<>(ph, s, isParallel);
         }
 
         @Override
         void initPartialTraversalState() {
             SpinedBuffer.OfLong b = new SpinedBuffer.OfLong();
             buffer = b;
             bufferSink = ph.wrapSink((Sink.OfLong) b::accept);
-            pusher = () -> spliterator.tryAdvance(bufferSink);
         }
 
         @Override
         public Spliterator.OfLong trySplit() {
             return (Spliterator.OfLong) super.trySplit();

@@ -449,20 +461,19 @@
                                   boolean parallel) {
             super(ph, spliterator, parallel);
         }
 
         @Override
-        AbstractWrappingSpliterator<P_IN, Double, ?> wrap(Spliterator<P_IN> s) {
+        AbstractWrappingSpliterator<P_IN, Double, SpinedBuffer.OfDouble> wrap(Spliterator<P_IN> s) {
             return new DoubleWrappingSpliterator<>(ph, s, isParallel);
         }
 
         @Override
         void initPartialTraversalState() {
             SpinedBuffer.OfDouble b = new SpinedBuffer.OfDouble();
             buffer = b;
             bufferSink = ph.wrapSink((Sink.OfDouble) b::accept);
-            pusher = () -> spliterator.tryAdvance(bufferSink);
         }
 
         @Override
         public Spliterator.OfDouble trySplit() {
             return (Spliterator.OfDouble) super.trySplit();
< prev index next >