Hi folks,

JDK24 brought with it the Gatherers API for enhanced stream processing.

In traditional streams, we have the normal reduce operators, e.g.:

var nums = 1..3
assert nums.stream().reduce('', (String string, number) -> string +
number) == '123'

Groovy supports this for collections using "inject":

assert nums.inject(''){ carry, next -> carry + next } == '123'

But now there is also the prefix sum variant "scan", which I am told
has a myriad of uses, though I don't commonly use it myself. Note it
has the same reduce function as above:

assert nums.stream()
    .gather(Gatherers.scan(() -> '', (string, number) -> string + number))
    .toList() == ['1', '12', '123']

We can also emulate this for collections (with a little ugliness)
using the vanilla inject:

assert nums.inject([]) { sum, next ->
    [*sum, "${sum.takeRight(1)[0] ?: ''}$next"]
} == ['1', '12', '123']

I am wondering whether we could actually provide the same
functionality as scan above, something like this (name "injectMany"
currently but open to a better name):

assert nums.injectMany(''){ carry, next -> carry + next } == ['1', '12', '123']

It is only a minor change to the inject code, so not a huge technical
challenge, but what do folks think? Should we round out our collection
support to provide similar functionality to that available in streams?

Regards,
Paul.

Reply via email to