Whither FlatMapper?

Sam Pullara spullara at gmail.com
Mon Apr 8 16:14:34 PDT 2013


That seems reasonable to me.

Sam

On Apr 8, 2013, at 4:02 PM, Brian Goetz <brian.goetz at oracle.com> wrote:

> Actually, there is an allocation-free path to get almost the Consumer-version performance with the non-consumer version, using the proposed StreamBuilder type (that also implements Spliterator and Stream, so "building" is allocation-free), and stuffing that into a ThreadLocal:
> 
>  ThreadLocal<StreamBuilder> tl = ...
> 
>  ...
> 
>  stream.flatMap(e -> {
>      StreamBuilder sb = tl.get();
>      sb.init();
>      // stuff elements into sb
>      return sb.build();  // basically a no-op
>  });
> 
> So I recant my earlier statement that there's no efficient way to simulate the consumer form.  Its just ugly.
> 
> And the above can be captured by a wrapping helper:
> 
>  Function<T, Stream<U>> = wrapWithThreadLocalStreamBuilder(
>     (T t, Consumer<U> target) -> { /* old way */ });
> 
> So, I'm even more firmly in the "remove it" camp.
> 
> On 4/8/2013 4:05 PM, Brian Goetz wrote:
>> A slight correction: if we remove the flatMap(FlatMapper), there is no
>> fluent form that is as efficient as the removed form that accepts (T,
>> Consumer<T>), since there's no other way to get your hands on the
>> downstream Sink.  (Not that this dampens my enthusiasm for removing it
>> much.)
>> 
>> For the truly diffident, a middle ground does exist: remove FlatMapper
>> and its six brothers as a named SAM, and replace it with BiConsumer<T,
>> Consumer<T>>, leaving both forms of flatMap methods in place:
>>   flatMap(Function<T,STream<U>>)
>>   flapMap(BiConsumer<T, Consumer<U>>)
>> 
>> The main advantage being that the package javadoc is not polluted by
>> seven forms of FlatMapper.
>> 
>> On 4/8/2013 3:27 PM, Doug Lea wrote:
>>> On 04/07/13 19:01, Sam Pullara wrote:
>>>> I'm a big fan of the current FlatMapper stuff that takes a Consumer.
>>>> Much more
>>>> efficient and straightforward when you don't have a stream or
>>>> collection to just
>>>> return. Here is some code that uses 3 of them for good effect:
>>> 
>>> I think the main issue is whether, given the user reactions so far, we
>>> should insist on people using a generally better but non-obvious
>>> approach to flat-mapping. Considering that anyone *could* write their own
>>> FlatMappers layered on top of existing functionality (we could
>>> even show how to do it as a code example somewhere), I'm with
>>> Brian on this: give people the obvious forms in the API. People
>>> who are most likely to use it are the least likely to be obsessive
>>> about its performance. And when they are, they can learn about
>>> alternatives.
>>> 
>>> -Doug
>>> 



More information about the lambda-libs-spec-experts mailing list