> From: "Remi Forax" <fo...@univ-mlv.fr>
> To: "David Alayachew" <davidalayac...@gmail.com>
> Cc: "core-libs-dev" <core-libs-dev@openjdk.org>
> Sent: Wednesday, January 10, 2024 8:19:15 AM
> Subject: Re: Gatherers -- conditionalWindowFixed?

> Hello David,
> testing the gatherer api, I also wanted a "window" operation as the one you 
> are
> describing.

> My use cases is a text file with some sections containing items organized like
> this

> :section1
> item1
> item2
> item3
> :section2
> item1
> item2
> ...

> For me the signature of such method, windowGroupBy??, should take a Predicate
> (is a section, so the reverse of what you are suggesting) and a function that
> take a value (for which the predicate is true) and return a Collector,
> so I can write something like

> record Section(String name, List<String> items) {}
> String input = ...
> List<Section> sections = input.lines()
> .gather(Gatherers.windowGroupBy(line -> line.startsWith(":"), name ->
> Collectors. collectingAndThen (Collectors.toList(), list -> new
> Section(name.substring(1), list))))
> .toList();

Thinking a little more, having a function that returns a Collector is a kind of 
an anti-pattern, it would be better to decouple the function that creates the 
section and the collector, so the same collector is re-used. 
So windowGroupBy?? should take a predicate, a collector and a function that 
takes the value (for which the predicate is true) and the result of the 
collector. 

< T , R , R2 > Gatherer < T , ?, R2 > windowGroupBy ( Predicate <? super T > 
predicate , Collector <? super T , ?, ? extends R > collector , BiFunction <? 
super T , ? super R , ? extends R2 > mapper ) 

Rémi 

>> From: "David Alayachew" <davidalayac...@gmail.com>
>> To: "core-libs-dev" <core-libs-dev@openjdk.org>
>> Sent: Wednesday, January 10, 2024 7:19:26 AM
>> Subject: Re: Gatherers -- conditionalWindowFixed?

>> And this may also be better named as a split method instead of the long
>> conditionalWindowFixed.

>> On Wed, Jan 10, 2024 at 1:17 AM David Alayachew < [
>> mailto:davidalayac...@gmail.com | davidalayac...@gmail.com ] > wrote:

>>> Oh, I made a mistake. Let me try it again.

>>> If the predicate is true, add the element to the current list (create list 
>>> prior
>>> if needed). Else if the predicate is false, send the list down to the 
>>> stream,
>>> then add the element to a new list (the new current list, if you will).

>>> On Wed, Jan 10, 2024 at 1:05 AM David Alayachew < [
>>> mailto:davidalayac...@gmail.com | davidalayac...@gmail.com ] > wrote:

>>>> Hello Core Libs Dev Team,

>>>> I have been reading through JEP 461 ( [ https://openjdk.org/jeps/461 |
>>>> https://openjdk.org/jeps/461 ] ) about Gatherers, and I'm really excited 
>>>> for
>>>> what this will enable for us.

>>>> By far, the most important functionality that this API facilitates is the
>>>> ability to create windows. Anytime I needed a window, I was basically 
>>>> forced to
>>>> use a for loop. Now, the 2 most common window cases are being handed to us 
>>>> for
>>>> free. It is very much appreciated.

>>>> Could we add one more method for a conditionalWindowFixed? We would need 
>>>> to pass
>>>> in some Predicate<T>. If the predicate returns true, create a list (if it 
>>>> does
>>>> not already exist) then add the element to it. If the predicate returns 
>>>> false
>>>> while the list is empty, then just move along to the next. Else if the
>>>> predicate returns false while the list is non empty, pass the list down 
>>>> into
>>>> the stream. So, you end up with Stream<T> -----> Stream<List<T>>.

>>>> The reason I think this is worth adding is because it facilitates a really
>>>> common use case. We may not want all windows to be the same size.

>>>> Is this something worth adding to the Gatherers API?

>>>> Thank you for your time and help!
>>>> David Alayachew

Reply via email to