< prev index next >

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

Print this page

        

*** 32,44 **** --- 32,48 ---- import java.util.Spliterator; import java.util.concurrent.CountedCompleter; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.BinaryOperator; + import java.util.function.Consumer; import java.util.function.DoubleBinaryOperator; + import java.util.function.DoubleConsumer; import java.util.function.IntBinaryOperator; + import java.util.function.IntConsumer; import java.util.function.LongBinaryOperator; + import java.util.function.LongConsumer; import java.util.function.ObjDoubleConsumer; import java.util.function.ObjIntConsumer; import java.util.function.ObjLongConsumer; import java.util.function.Supplier;
*** 961,966 **** --- 965,1101 ---- } // GC spliterator, left and right child super.onCompletion(caller); } } + + static final class FoldLeftWithSeedOp<U, T> extends Box<U> implements Consumer<T> { + private final BiFunction<U, ? super T, U> op; + + FoldLeftWithSeedOp(U seed, BiFunction<U, ? super T, U> op) { + this.state = seed; + this.op = op; + } + + @Override + public void accept(T t) { + state = op.apply(state, t); + } + } + + static final class FoldLeftOp<T> implements Consumer<T> { + private final BinaryOperator<T> op; + private T state; + private boolean empty = true; + + FoldLeftOp(BinaryOperator<T> op) { + this.op = op; + } + + @Override + public void accept(T t) { + if (empty) { + state = t; + empty = false; + } else { + state = op.apply(state, t); + } + } + + Optional<T> get() { + return empty ? Optional.empty() : Optional.of(state); + } + } + + static final class IntFoldLeftOp implements IntConsumer { + private final IntBinaryOperator op; + private int state; + private boolean empty = true; + + IntFoldLeftOp(IntBinaryOperator op) { + this.op = op; + } + + @Override + public void accept(int t) { + if (empty) { + state = t; + empty = false; + } else { + state = op.applyAsInt(state, t); + } + } + + OptionalInt get() { + return empty ? OptionalInt.empty() : OptionalInt.of(state); + } + + int getAsInt() { + if (empty) { + throw new IllegalStateException(); + } + return state; + } + } + + static final class LongFoldLeftOp implements LongConsumer { + private final LongBinaryOperator op; + private long state; + private boolean empty = true; + + LongFoldLeftOp(LongBinaryOperator op) { + this.op = op; + } + + @Override + public void accept(long t) { + if (empty) { + state = t; + empty = false; + } else { + state = op.applyAsLong(state, t); + } + } + + OptionalLong get() { + return empty ? OptionalLong.empty() : OptionalLong.of(state); + } + + long getAsLong() { + if (empty) { + throw new IllegalStateException(); + } + return state; + } + } + + static final class DoubleFoldLeftOp implements DoubleConsumer { + private final DoubleBinaryOperator op; + private double state; + private boolean empty = true; + + DoubleFoldLeftOp(DoubleBinaryOperator op) { + this.op = op; + } + + @Override + public void accept(double t) { + if (empty) { + state = t; + empty = false; + } else { + state = op.applyAsDouble(state, t); + } + } + + OptionalDouble get() { + return empty ? OptionalDouble.empty() : OptionalDouble.of(state); + } + + double getAsDouble() { + if (empty) { + throw new IllegalStateException(); + } + return state; + } + } }
< prev index next >