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.