From 5a464e20125dec08c978a8965dc474d71093f47f Mon Sep 17 00:00:00 2001 From: mperor Date: Thu, 24 Sep 2026 18:20:27 +0200 Subject: [PATCH] Add custom distinctBy gatherer test and update README (24/25) --- JavaReleases/README.md | 2 ++ .../test/java/pl/mperor/lab/java/Java24.java | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/JavaReleases/README.md b/JavaReleases/README.md index bb26a6a..979b5fc 100644 --- a/JavaReleases/README.md +++ b/JavaReleases/README.md @@ -27,6 +27,8 @@ This project includes unit tests for key functionalities introduced in each Java - [Java 21™](src/test/java/pl/mperor/lab/java/Java21.java) - [Java 22™](src/test/java/pl/mperor/lab/java/Java22.java) - [Java 23™](src/test/java/pl/mperor/lab/java/Java23.java) +- [Java 24™](src/test/java/pl/mperor/lab/java/Java24.java) +- [Java 25™](src/test/java/pl/mperor/lab/java/Java25.java) For detailed examples and tests of each feature, please refer to the individual source files linked above. diff --git a/JavaReleases/src/test/java/pl/mperor/lab/java/Java24.java b/JavaReleases/src/test/java/pl/mperor/lab/java/Java24.java index 3014935..68c7618 100644 --- a/JavaReleases/src/test/java/pl/mperor/lab/java/Java24.java +++ b/JavaReleases/src/test/java/pl/mperor/lab/java/Java24.java @@ -3,9 +3,13 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.HashSet; import java.util.List; +import java.util.function.Function; +import java.util.stream.Gatherer; import java.util.stream.Gatherers; import java.util.stream.IntStream; +import java.util.stream.Stream; /// Java 24 (March 2025) /// [JDK 24](https://openjdk.org/projects/jdk/24) @@ -51,4 +55,25 @@ public void testWindowFixedGatherer() { List.of(3) ), result); } -} \ No newline at end of file + + @Test + public void testCreateGatherer() { + var result = Stream.of("one", "two", "three", "four", "five") + .gather(distinctBy(String::length)) + .toList(); + + Assertions.assertEquals(List.of("one", "three", "four"), result); + } + + /// Keeps only the first element for each key produced by `extractor`. + private static Gatherer distinctBy(Function extractor) { + return Gatherer.ofSequential(HashSet

::new, Gatherer.Integrator.ofGreedy( + (seen, element, downstream) -> { + if (seen.add(extractor.apply(element))) { + return downstream.push(element); + } + return true; + } + )); + } +}