Binary operator in reduce for parallel and unordered streams
Georgiy Rakov
georgiy.rakov at oracle.com
Fri Mar 22 11:17:08 PDT 2013
Hello,
let's consider following Stream method:
T reduce(T identity, BinaryOperator<T> reducer)
According to some intuition I see that following constraints should be
imposed on reducer depending on the stream type:
- if stream is parallel provided encounter ordered is determined reducer
must be /associative /(but /commutative /property is not required),
otherwise the result, say, is not guaranteed to be deterministic; i.e.
for any a, b and c check must always be true:
T r1 = reducer.apply(reducer.apply(a, b), c);
T r2 = reducer.apply(a, reducer.apply(b, c));
boolean check = r1.equals(r2);
- if stream is unordered (encounter ordered isn't determined) reducer
must be both /associative /and /commutative, /otherwise the result, say,
is not guaranteed to be deterministic; i.e. for any a, b and c check
must always be true:
T r1 = reducer.apply(reducer.apply(a, b), c);
T r2 = reducer.apply(a, reducer.apply(b, c));
boolean check1 = r1.equals(r2);
and for any a and b check must always be true:
T r1 = reducer.apply(a, b);
T r2 = reducer.apply(b, a);
boolean check = r1.equals(r2);
- for sequential stream reducer is required to have no constraints, i.e.
result will be deterministic in any way (including that neither
associative nor commutative property is required);
I wonder whether this intuition is right and if it is whether spec will
specify such constraints.
BTW this intuition now contradicts in some way with spec which says that
reducing function must always be _*/associative/*_/:/
/////////Perform a /reduction/ on the elements of this stream using
the provided identity value and an _*associative *_reducing
function, and return the reduced value/////////
//////////////////
Please provide your comments.
Thanks,
Georgiy.
More information about the lambda-dev
mailing list