----- Mail original -----
> De: "Paul Sandoz" <paul.san...@oracle.com>
> À: "Remi Forax" <fo...@univ-mlv.fr>
> Cc: "Peter Levart" <peter.lev...@gmail.com>, "Patrick Concannon" 
> <patrick.concan...@oracle.com>, "Julia Boes"
> <julia.b...@oracle.com>, "core-libs-dev" <core-libs-dev@openjdk.java.net>
> Envoyé: Mardi 7 Juillet 2020 21:04:09
> Objet: Re: RFR[8238286]: 'Add new flatMap stream operation that is more 
> amenable to pushing’

> Hi Remi,
> 
> I stress again that the short-circuiting optimizations are an implementation
> detail that are partially applied. The behavior is not specified. It's already
> inconsistent.
> 
> We might be able to improve on certain cases, as in Peter’s example, and apply
> an optimization consistently for flatMap and mapMulti. But I would prefer we
> focus on what we have now and consider that later if need be.

I don't think an incremental evolution works here,
because apart from people trying to understand streams, you have also a whole 
ecosystem on top of the stream API like by example IDEs that can refactor, 
provide visual debugging, etc of streams.

> 
> Paul.

Rémi

> 
>> On Jul 7, 2020, at 11:20 AM, fo...@univ-mlv.fr wrote:
>> 
>> At the same time,
>> mapMulti and flatMap are two sides of the same coins,
>> flatMap uses a pull API while mapMulti uses a push API.
>> 
>> so having mapMulti and flatMap doing cancellation differently is 
>> inconsistent.
>> 
>> Consistency is a good way to avoid to expect that all operations do
>> short-circuiting optimizations.
>> 
>> Rémi
>> 
>> ----- Mail original -----
>>> De: "Paul Sandoz" <paul.san...@oracle.com>
>>> À: "Peter Levart" <peter.lev...@gmail.com>
>>> Cc: "Patrick Concannon" <patrick.concan...@oracle.com>, "Remi Forax"
>>> <fo...@univ-mlv.fr>, "Julia Boes"
>>> <julia.b...@oracle.com>, "core-libs-dev" <core-libs-dev@openjdk.java.net>
>>> Envoyé: Mardi 7 Juillet 2020 20:09:01
>>> Objet: Re: RFR[8238286]: 'Add new flatMap stream operation that is more 
>>> amenable
>>> to pushing’
>> 
>>> Hi Peter,
>>> 
>>> You guessed correctly about the motivation from the API perspective.
>>> 
>>> I would like to stress that short-circuiting optimizations are an 
>>> implementation
>>> detail that are only partially applied. Surfacing the notion of cooperative
>>> cancellation for one operation has quite a cost, and will likely increase 
>>> the
>>> expectation that it applies in all scenarios.
>>> 
>>> My sense is your example is likely more of on the edge than common. I 
>>> believe
>>> it's simple to implement but would prefer to hold off and focus the current
>>> implementation and integrate, then we could reconsider afterwards if need 
>>> be.
>>> 
>>> Paul.
>>> 
>>>> On Jul 5, 2020, at 1:44 AM, Peter Levart <peter.lev...@gmail.com> wrote:
>>>> 
>>>> Hi Patric, Julia,
>>>> 
>>>> On 7/2/20 6:45 PM, Patrick Concannon wrote:
>>>>> http://cr.openjdk.java.net/~pconcannon/8238286/webrevs/webrev.03/
>>>>> <http://cr.openjdk.java.net/~pconcannon/8238286/webrevs/webrev.03/>
>>>> 
>>>> 
>>>> Then I'd like to discuss cancelation (shortcut Streams). Currently 
>>>> mapMulti does
>>>> not do anything to optimize processing if the downstream decides it does 
>>>> not
>>>> need more elements but just keeps pushing. This is a decision I guess to 
>>>> keep
>>>> the API surface clean and simple. All short-cutting ops or even 
>>>> intermediate
>>>> (like limit) must therefore ignore the surplus elements that are emitted by
>>>> mapMulti and they do so. If the intermediate operations up-stream mapMulti 
>>>> are
>>>> respecting the cancelation, this results in at most one invocation of 
>>>> mapMulti
>>>> function producing surplus elements, but if they don't, then multiple
>>>> invocations of mapMulti function is producing surplus elements.
>>>> 
>>>> For example:
>>>> 
>>>> 
>>>>    someStream
>>>> 
>>>>        .mapMulti((e, sink) -> { .... sink.accept(x); ... })
>>>> 
>>>>        .filter(x -> ...)
>>>> 
>>>>        .mapMulti((x, sink) -> { ... sink.accept(y); ...})
>>>> 
>>>>        .limit(10)
>>>> 
>>>>        ...
>>>> 
>>>> 
>>>> Here the 1st mapMulti emits elements and each of them is filtered and then 
>>>> maybe
>>>> passed to 2nd mapMulti. the 2nd mapMulti could skip calling its function 
>>>> if the
>>>> downstream limit(10) has already passed 10 elements.
>>>> 
>>>> 
>>>> WDYT?
>>>> 
>>>> 
>>>> Regards, Peter

Reply via email to