Re: RFR[8238286]: 'Add new flatMap stream operation that is more amenable to pushing’

Anthony Vanelverdinghe dev at anthonyv.be
Sat Jul 4 16:43:26 UTC 2020


Hi Julia

Since short-circuiting sounds similar to a Subscriber cancelling its 
Subscription, I believe it might be worthwhile to consider the Flow API.
If the argument would be a `Flow.Processor<T, R>`, then the 
implementation would publish instances of T to it, subscribe to receive 
instances of R, and be able to short-circuit by cancelling its Subscription.

Disclaimer: I haven't actually prototyped this, but it makes sense at 
first thought

Kind regards,
Anthony

On 03/07/2020 11:00, Julia Boes wrote:
> Hi Tagir,
>> By the way, the proposed API allows no possibility to short-circuit
>> the pusher. So if mapMulti produces many elements and short-circuiting
>> terminal operation like anyMatch finds the match, it won't stop the
>> pusher from pushing. Have you considered to use
>> BiConsumer<Predicate<T>, T>, so Stream API may signal to the pusher
>> that it's ok to stop pushing? Note that in modern Java versions,
>> flatMap can actually short-circuit.
>
> We did prototype mapMulti with a Predicate and it brought to light 
> some limitations that led us to decide against this approach.
>
> 1) On the user side, Predicate::test or Predicate::negate would be 
> used to check if it's ok to keep pushing. The semantics of these 
> methods doesn't really fit the use case (short-circuiting requested 
> true/false) and we would probably need to come up with a new method to 
> avoid confusion.
>
> 2) Along the lines of 1), but more generally the burden of exposing an 
> implementation detail to the user. You are right that flatMap supports 
> short-circuiting, but it's hidden in the implementation and the user 
> doesn't need to know how it's implemented or how to make it work. For 
> mapMulti however, we would need to expose some of it through the use 
> of Predicate, and explain to the user how to use it correctly.
>
> 3) While the JDK implementation uses Sink, a type of Consumer that 
> supports cancellation, the default implementation uses SpinedBuffer, a 
> type of Consumer that does not support cancellation. We would need to 
> add that functionality.
>
> 4) The difficulty of signalling a short-circuit request across the 
> stream pipeline, in particular because mapMulti uses flatMap 
> internally, which creates something like an inner nested pipeline. 
> While it's possible to signal across the main outer pipeline, it's not 
> easy to signal between outer and inner pipeline.
>
>
> Regards,
>
> Julia
>
>
>


More information about the core-libs-dev mailing list