On 02/12/2015 04:51 PM, Peter Levart wrote:

On 02/03/2015 02:48 PM, Paul Sandoz wrote:
Hi,

http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8071600-Collector-flatMapping/webrev/

This patch adds a new flat mapping collector to Collectors. This can be useful 
if one needs to map 0 or more items into a downstream collector.

A CCC will be filed.

A following patch, which i plan to fold into the above patch, performs some 
renames on the collectors test to be consistent with the current naming:

http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8071600-Collector-flatMapping-test-rename/webrev/

Thanks,
Paul.

Hi Paul,

Would the following "optimization" make any sense?

    public static <T, U, A, R>
Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper, Collector<? super U, A, R> downstream) { BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
        return new CollectorImpl<>(downstream.supplier(),
            (r, t) -> {
                try (Stream<? extends U> result = mapper.apply(t)) {
                    if (result != null) {
                        ((result.isParallel() &&
!downstream.characteristics().contains(Collector.Characteristics.CONCURRENT))
? result.sequential() : result).forEach(u -> downstreamAccumulator.accept(r, u));
                    }
                }
            },
            downstream.combiner(), downstream.finisher(),
            downstream.characteristics());
    }


Regards, Peter


Collector does not know how it is being used by the feeding Stream in advance, right? I guess above "optimization" would only make sense if the feeding Stream was sequential and flat-mapping function returned a parallel stream and the downstream Collector supported CONCURRENT collecting. But if feeding Stream is already parallel and Collector supports CONCURRENT collecting, then accumulating function is already being invoked in multiple threads and expanding each invocation into separate concurrent tasks would make FJ pool execute more tasks (nested parallelism). I don't know if this works best currently.

Peter

Reply via email to