src/share/classes/java/util/stream/ReduceOps.java

Print this page
rev 7597 : 8015318: Extend Collector with 'finish' operation
Reviewed-by:
Contributed-by: brian.goetz@oracle.com

@@ -146,39 +146,38 @@
     /**
      * Constructs a {@code TerminalOp} that implements a mutable reduce on
      * reference values.
      *
      * @param <T> the type of the input elements
-     * @param <R> the type of the result
+     * @param <I> the type of the intermediate reduction result
+     * @param <I> the type of the final reduction result
      * @param collector a {@code Collector} defining the reduction
      * @return a {@code ReduceOp} implementing the reduction
      */
-    public static <T,R> TerminalOp<T, R>
-    makeRef(Collector<? super T,R> collector) {
-        Supplier<R> supplier = Objects.requireNonNull(collector).resultSupplier();
-        BiFunction<R, ? super T, R> accumulator = collector.accumulator();
-        BinaryOperator<R> combiner = collector.combiner();
-        class ReducingSink extends Box<R>
-                implements AccumulatingSink<T, R, ReducingSink> {
+    public static <T, I, R> TerminalOp<T, I>
+    makeRef(Collector<? super T, I, R> collector) {
+        Supplier<I> supplier = Objects.requireNonNull(collector).supplier();
+        BiConsumer<I, ? super T> accumulator = collector.accumulator();
+        BinaryOperator<I> combiner = collector.combiner();
+        class ReducingSink extends Box<I>
+                implements AccumulatingSink<T, I, ReducingSink> {
             @Override
             public void begin(long size) {
                 state = supplier.get();
             }
 
             @Override
             public void accept(T t) {
-                R newResult = accumulator.apply(state, t);
-                if (state != newResult)
-                    state = newResult;
+                accumulator.accept(state, t);
             }
 
             @Override
             public void combine(ReducingSink other) {
                 state = combiner.apply(state, other.state);
             }
         }
-        return new ReduceOp<T, R, ReducingSink>(StreamShape.REFERENCE) {
+        return new ReduceOp<T, I, ReducingSink>(StreamShape.REFERENCE) {
             @Override
             public ReducingSink makeSink() {
                 return new ReducingSink();
             }