PipelineHelper and ParallelPipelineHelper
Paul Sandoz
paul.sandoz at oracle.com
Mon Sep 24 12:16:55 PDT 2012
Hi
Here is a rough start refactoring to introduce a PipelineHelper for the serial case and a corresponding ParallelPipelineHelper for the parallel case:
http://cr.openjdk.java.net/~psandoz/lambda/ophelper/webrev/
Needs more work before committing.
All the tests pass.
Part of the reason for this is to clean up TerminalOp and ShortCircuitTerminalOp. For serial evaluation the latter should always pull (even if a sink is used) while the former could pull/push depending on whether there is a intermediate short-circuiting op, or the stream has already been pulled from before evaluation, or because it is implementation chooses to pull rather than push.
I am not sure i have the methods on PipelineHelper/ParallelPipelineHelper quite sorted out just yet.
In the parallel case ParallelPipelineHelper is most often used as follows:
spliterator.into(helper.wrapSink(reduceStage)); // non-short circuiting
helper.wrapIterator(spliterator.iterator()) // short-circuiting
So currently the only relationship between ParallelPipelineHelper and PipelineHelper is the requirement for parallel evaluation to defer to serial evaluation when there is no implementation for the former. Hence the inheritance relationship:
RES evaluate(PipelineHelper<E_RES> helper);
@Override
<E_SRC> RES evaluateParallel(ParallelPipelineHelper<E_SRC, E_RES> helper) default {
System.out.println(getClass().getSimpleName() + " using TerminalOp.computeParallel serial default");
return evaluate(helper);
}
I also tried to make clearer the definition of the type variables.
Paul.
More information about the lambda-dev
mailing list