src/share/classes/java/util/stream/ReferencePipeline.java
Print this page
rev 7597 : 8015318: Extend Collector with 'finish' operation
Reviewed-by:
Contributed-by: brian.goetz@oracle.com
@@ -488,20 +488,25 @@
public final <R> R reduce(R identity, BiFunction<R, ? super P_OUT, R> accumulator, BinaryOperator<R> combiner) {
return evaluate(ReduceOps.makeRef(identity, accumulator, combiner));
}
@Override
- public final <R> R collect(Collector<? super P_OUT, R> collector) {
+ public final <R, A> R collect(Collector<? super P_OUT, A, R> collector) {
+ A container;
if (isParallel()
&& (collector.characteristics().contains(Collector.Characteristics.CONCURRENT))
&& (!isOrdered() || collector.characteristics().contains(Collector.Characteristics.UNORDERED))) {
- R container = collector.resultSupplier().get();
- BiFunction<R, ? super P_OUT, R> accumulator = collector.accumulator();
- forEach(u -> accumulator.apply(container, u));
- return container;
+ container = collector.supplier().get();
+ BiConsumer<A, ? super P_OUT> accumulator = collector.accumulator();
+ forEach(u -> accumulator.accept(container, u));
}
- return evaluate(ReduceOps.makeRef(collector));
+ else {
+ container = evaluate(ReduceOps.makeRef(collector));
+ }
+ return collector.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)
+ ? (R) container
+ : collector.finisher().apply(container);
}
@Override
public final <R> R collect(Supplier<R> resultFactory,
BiConsumer<R, ? super P_OUT> accumulator,