Stream.foldLeft, one more time (8133680)
Paul Sandoz
paul.sandoz at oracle.com
Wed Feb 3 14:29:02 UTC 2016
Hi Tagir,
I think this is reasonable, no objections.
Naming-wise reduceLeft might fit better.
Those default methods look good. We might be able to do a little better tweaking stuff in ForEachOps to avoid the array box, for some increase in code i.e. a clone of ForEachOps.ForEachOp.
Testing-wise see that for take/dropWhile for testing default methods.
Paul.
> On 29 Jan 2016, at 14:37, Tagir F. Valeev <amaembo at gmail.com> wrote:
>
> Hello!
>
> What do you think, is it still reasonable to add foldLeft operation to
> JDK-9 Stream API (foldLeft only, no foldRight)?
>
> I propose the following signatures:
>
> interface Stream {
> public <U> U foldLeft(U seed, BiFunction<U, ? super T, U> accumulator);
> public Optional<T> foldLeft(BinaryOperator<T> accumulator);
> }
>
> interface IntStream {
> public int foldLeft(int seed, IntBinaryOperator accumulator);
> public OptionalInt foldLeft(IntBinaryOperator accumulator);
> }
>
> interface LongStream {
> public OptionalLong foldLeft(LongBinaryOperator accumulator);
> public long foldLeft(long seed, LongBinaryOperator accumulator);
> }
>
> interface DoubleStream {
> public OptionalDouble foldLeft(DoubleBinaryOperator accumulator);
> public double foldLeft(double seed, DoubleBinaryOperator accumulator);
> }
>
> They are similar to the corresponding reduce operations, but it's not
> required for accumulator to be associative and it's not required for
> seed to have identity properties. It should be clearly stated in
> JavaDoc that for associative accumulator reduce should be used
> instead.
>
> All methods can be easily implemented as default methods in the
> interfaces. For example, DoubleStream::foldLeft:
>
> public double foldLeft(double seed, DoubleBinaryOperator accumulator) {
> double[] box = new double[] { seed };
> forEachOrdered(t -> box[0] = accumulator.applyAsDouble(box[0], t));
> return box[0];
> }
>
> I can take this issue (if nobody works on it already), but in order
> not to do the useless work I want to be sure that there are no strong
> objections against such feature.
>
> With best regards,
> Tagir Valeev.
>
More information about the core-libs-dev
mailing list