For interest, the code using Gatherers4J looks like:

    assert names.stream()
        .gather(Gatherers4j.filterIndexed {index, element -> index ==
3 }) // JDK24
        .findFirst().get() == 'arne'

You can also use something like this using vanilla streams:

    assert names.stream().skip(3).limit(1).findFirst().get() == 'arne'

I also forgot about Tim Yates' library:

    https://timyates.github.io/groovy-stream/

It has various "withIndex" methods, e.g. mapWithIndex, zipWithIndex,
filterWithIndex, flatMapWithIndex, untilWithIndex, tapWithIndex,
tapEveryWithIndex.
With groovy-stream, you'd do:

    assert Stream.from(names).filterWithIndex{ n, i -> i == 3
}.toList()[0] == 'arne'

You pose a good question though about whether functionality like this
should be brought into the main Groovy modules.

Cheers, Paul.

On Sun, Mar 23, 2025 at 1:52 PM Paul King <pa...@asert.com.au> wrote:
>
> It might be worth exploring this. I'll note that gatherers (JDK 24)
> provide a hook for adding such functionality in Java. Gatherers4j has
> withIndex (though we'd likely implement it differently):
>
> https://tginsberg.github.io/gatherers4j/gatherers/sequence-operations/withindex/
>
> As well as a bunch of other "index" operations.
>
> Paul.
>
> On Fri, Mar 21, 2025 at 2:00 AM Per Nyfelt <per.nyf...@nordnet.se> wrote:
> >
> > Hi ,
> >
> >
> >
> > I suggest that the withIndex method in DefaultGroovyMethods is overloaded 
> > with an option to support streams as well
> >
> >
> >
> > Given
> >
> >
> >
> > names = ['per', 'karin', 'tage', 'arne', 'sixten', 'ulrik']
> >
> >
> >
> > I can find the 4:th element with
> >
> > println names[3]
> >
> >
> >
> > or if I only have an iterator with
> >
> > println names.iterator().withIndex().find { it, idx -> 3 == idx }[0]
> >
> >
> >
> > For a stream I can do it by using a 
> > java.util.concurrent.atomic.AtomicInteger:
> >
> > AtomicInteger index = new AtomicInteger()
> >
> > println names.stream().find(n -> 3 == index.getAndIncrement())
> >
> >
> >
> > I have seen that libraries more and more often will expose a stream api 
> > rather than a Collection or an Iterator so it would be very nice if I could 
> > just do
> >
> > println names.stream().withIndex().find { it, idx -> 3 == idx}[0]
> >
> >
> >
> > or alternatively add a findWithIndex so that this would be possible:
> >
> > println names.stream().findWithIndex { it, idx -> 3 == idx}
> >
> >
> >
> > What do you think?
> >
> >
> >
> > Regards,
> >
> > Per

Reply via email to