[External] : Sharing more of my experience with a custom Gatherer (windowBy)
Viktor Klang
viktor.klang at oracle.com
Tue Nov 18 10:17:34 UTC 2025
Thanks for sharing your experience, David!
On 2025-11-17 15:08, David Alayachew wrote:
> Hello @core-libs-dev <mailto:core-libs-dev at openjdk.org>,
>
> This is a follow up of one of my previous experience reports, a little
> over a year ago.
>
> https://mail.openjdk.org/pipermail/core-libs-dev/2024-August/127293.html
>
> Just wanted to report more of my positive experiences with Gatherers,
> specifically with a custom Gatherer that @Viktor Klang
> <mailto:viktor.klang at oracle.com> made for me called windowBy. Here is
> the implementation below.
>
> <TR> Gatherer<TR, ?, List<TR>> windowBy(Predicate<TR>
> includeInCurrentWindow) {
> class State {
> ArrayList<TR> window;
>
> boolean integrate(TR element, Gatherer.Downstream<? super
> List<TR>> downstream) {
> if (window != null && !includeInCurrentWindow.test(element)) {
> var result = Collections.unmodifiableList(window);
> window = null;
> if (!downstream.push(result))
> return false;
> }
>
> if (window == null)
> window = new ArrayList<>();
>
> return window.add(element);
> }
>
> void finish(Gatherer.Downstream<? super List<TR>> downstream) {
> if (window != null) {
> var result = Collections.unmodifiableList(window);
> window = null;
> downstream.push(result);
> }
> }
> }
> return Gatherer.<TR, State, List<TR>>ofSequential(State::new,
> State::integrate, State::finish);
> }
>
> Clean and simple.
>
> Anyways, as for my experience report, a found a brand new way to use
> this custom Gatherer -- event coalescing.
>
> Sometimes, if consecutive events being streamed are of the same type,
> then to reduce computation, you might be able to avoid doing more work
> by grouping together the potential duplicates, then handling them
> separately in a coalescing path. I'd much rather solve that problem
> than a caching problem lol.
>
> Anyways, here are the 2 examples where it served me well.
>
> 1. Network Request Coalescing.
> 1. When checking the availability of certain networks, I am now
> able to save some bandwidth by combining multiple, consecutive
> requests within a certain time to a certain network. And since
> I am definitely bandwidth bound, that helps. Nothing I
> couldn't do before, but keeping it within Streams allowed me
> to avoid ripping out my old solution when it stopped being a
> good fit. I wish I could share the code, but it's not my right
> to share it.
> 2. Path-Finding Algorithm -- Clustering
> 1. This one is still a work in progress, so I may be speaking
> prematurely here. But I was so impressed that this is working
> thus far. Long story short, I am building a path-finding
> algorithm where, if a set of points are close enough together,
> then they can be serviced as a group, and thus, lower the
> total weight of servicing those nodes, as opposed to servicing
> them individually. Again, not done yet, so I might be jumping
> the gun, but it worked so well for me out of the box, that I
> thought it was worth sharing.
>
> Hopefully this bumps up windowBy on the triage list of potential
> pre-built gatherers to add to the standard library. And thanks again
> to Viktor and friends for putting this Gatherers library together --
> it's a great addition!
>
> Thank you all for your time and consideration!
> David Alayachew
--
Cheers,
√
Viktor Klang
Software Architect, Java Platform Group
Oracle
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/core-libs-dev/attachments/20251118/4b98c699/attachment-0001.htm>
More information about the core-libs-dev
mailing list