diff --git a/core-java-modules/core-java-streams-7/pom.xml b/core-java-modules/core-java-streams-7/pom.xml index 892ad66f94f4..39cb2e46aa0b 100644 --- a/core-java-modules/core-java-streams-7/pom.xml +++ b/core-java-modules/core-java-streams-7/pom.xml @@ -35,8 +35,8 @@ - 12 - 12 + 24 + 24 0.10.2 3.23.1 3.12.0 diff --git a/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/NumericSumGatherer.java b/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/NumericSumGatherer.java new file mode 100644 index 000000000000..62ac79880f94 --- /dev/null +++ b/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/NumericSumGatherer.java @@ -0,0 +1,39 @@ +package com.baeldung.streams.gatherer; + +import java.util.ArrayList; +import java.util.function.BiConsumer; +import java.util.function.Supplier; +import java.util.stream.Gatherer; + +public class NumericSumGatherer implements Gatherer, Integer> { + + @Override + public Supplier> initializer() { + return ArrayList::new; + } + + @Override + public Integrator, Integer, Integer> integrator() { + return new Integrator<>() { + @Override + public boolean integrate(ArrayList state, Integer element, Downstream downstream) { + if (state.isEmpty()) { + state.add(element); + } else { + state.addFirst(state.getFirst() + element); + } + return true; + } + }; + } + + @Override + public BiConsumer, Downstream> finisher() { + return (state, downstream) -> { + if (!downstream.isRejecting() && !state.isEmpty()) { + downstream.push(state.getFirst()); + state.clear(); + } + }; + } +} diff --git a/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/SentenceSplitterGatherer.java b/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/SentenceSplitterGatherer.java new file mode 100644 index 000000000000..af3b2f7acd74 --- /dev/null +++ b/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/SentenceSplitterGatherer.java @@ -0,0 +1,36 @@ +package com.baeldung.streams.gatherer; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.BinaryOperator; +import java.util.function.Supplier; +import java.util.stream.Gatherer; + +public class SentenceSplitterGatherer implements Gatherer,String> { + + @Override + public Supplier> initializer() { + return ArrayList::new; + } + + @Override + public BinaryOperator> combiner() { + return (left, right) -> { + left.addAll(right); + return left; + }; + } + + @Override + public Integrator, String, String> integrator() { + return (state, element, downstream) -> { + var words = element.split("\\s+"); + for (var word : words) { + state.add(word); + downstream.push(word); + } + return true; + }; + } +} diff --git a/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/SlidingWindowGatherer.java b/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/SlidingWindowGatherer.java new file mode 100644 index 000000000000..4b85ab58663b --- /dev/null +++ b/core-java-modules/core-java-streams-7/src/main/java/com/baeldung/streams/gatherer/SlidingWindowGatherer.java @@ -0,0 +1,40 @@ +package com.baeldung.streams.gatherer; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Supplier; +import java.util.stream.Gatherer; + +public class SlidingWindowGatherer implements Gatherer, List> { + + @Override + public Supplier> initializer() { + return ArrayList::new; + } + + @Override + public Integrator, Integer, List> integrator() { + return new Integrator<>() { + @Override + public boolean integrate(ArrayList state, Integer element, Downstream> downstream) { + state.add(element); + if (state.size() == 3) { + downstream.push(new ArrayList<>(state)); + state.removeFirst(); + } + return true; + } + }; + } + + @Override + public BiConsumer, Downstream>> finisher() { + return (state, downstream) -> { + if (state.size()==3) { + downstream.push(new ArrayList<>(state)); + } + }; + + } +} diff --git a/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/GathererUnitTest.java b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/GathererUnitTest.java new file mode 100644 index 000000000000..5373745dea96 --- /dev/null +++ b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/GathererUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.streams.gatherer; + +import java.util.List; +import java.util.stream.Gatherer; +import java.util.stream.Gatherers; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GathererUnitTest { + + @Test + void givenNumbers_whenFolded_thenSumIsEmitted() { + Stream numbers = Stream.of(1, 2, 3, 4, 5); + Stream folded = numbers.gather(Gatherers.fold(() -> 0, Integer::sum)); + List resultList = folded.toList(); + Assertions.assertEquals(1, resultList.size()); + Assertions.assertEquals(Integer.valueOf(15), resultList.getFirst()); + } + + @Test + void givenWords_whenMappedConcurrently_thenUppercasedWordsAreEmitted() { + Stream words = Stream.of("a", "b", "c", "d"); + List resultList = words.gather(Gatherers.mapConcurrent(2, String::toUpperCase)) + .toList(); + Assertions.assertEquals(4, resultList.size()); + Assertions.assertEquals(List.of("A", "B", "C", "D"), resultList); + } + + @Test + void givenNumbers_whenScanned_thenRunningTotalsAreEmitted() { + Stream numbers = Stream.of(1, 2, 3, 4); + List resultList = numbers.gather(Gatherers.scan(() -> 0, Integer::sum)) + .toList(); + Assertions.assertEquals(4, resultList.size()); + Assertions.assertEquals(List.of(1, 3, 6, 10), resultList); + } + + @Test + void givenNumbers_whenWindowedSliding_thenOverlappingWindowsAreEmitted() { + List> expectedOutput = List.of(List.of(1, 2, 3), List.of(2, 3, 4), List.of(3, 4, 5)); + Stream numbers = Stream.of(1, 2, 3, 4, 5); + List> resultList = numbers.gather(Gatherers.windowSliding(3)) + .toList(); + Assertions.assertEquals(3, resultList.size()); + Assertions.assertEquals(expectedOutput, resultList); + } + + @Test + void givenStrings_whenUsingCustomGatherer_thenLengthsAreCalculated() { + List expectedOutput = List.of(5, 6, 3); + Stream inputStrings = Stream.of("apple", "banana", "cat"); + List resultList = inputStrings.gather(Gatherer.of((state, element, downstream) -> { + downstream.push(element.length()); + return true; + })) + .toList(); + Assertions.assertEquals(3, resultList.size()); + Assertions.assertEquals(expectedOutput, resultList); + } +} diff --git a/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/NumericSumGathererUnitTest.java b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/NumericSumGathererUnitTest.java new file mode 100644 index 000000000000..df16bf8f05f5 --- /dev/null +++ b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/NumericSumGathererUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.streams.gatherer; + +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class NumericSumGathererUnitTest { + + @Test + void givenNumbers_whenUsingCustomManyToOneGatherer_thenSumIsCalculated() { + Stream inputValues = Stream.of(1, 2, 3, 4, 5, 6); + List result = inputValues.gather(new NumericSumGatherer()) + .toList(); + Assertions.assertEquals(Integer.valueOf(21), result.getFirst()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/SentenceSplitterGathererUnitTest.java b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/SentenceSplitterGathererUnitTest.java new file mode 100644 index 000000000000..8a1b9eb4bf7e --- /dev/null +++ b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/SentenceSplitterGathererUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.streams.gatherer; + +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SentenceSplitterGathererUnitTest { + + @Test + void givenSentences_whenUsingCustomOneToManyGatherer_thenWordsAreExtracted() { + List expectedOutput = List.of("hello", "world", "java", "streams"); + Stream sentences = Stream.of("hello world", "java streams"); + List words = sentences.gather(new SentenceSplitterGatherer()) + .toList(); + Assertions.assertEquals(expectedOutput, words); + } +} diff --git a/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/SlidingWindowGathererUnitTest.java b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/SlidingWindowGathererUnitTest.java new file mode 100644 index 000000000000..99e6f02018e0 --- /dev/null +++ b/core-java-modules/core-java-streams-7/src/test/java/com/baeldung/streams/gatherer/SlidingWindowGathererUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.streams.gatherer; + +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SlidingWindowGathererUnitTest { + + @Test + void givenNumbers_whenWindowedSliding_thenOverlappingWindowsAreEmitted() { + List> expectedOutput = List.of(List.of(1, 2, 3), List.of(2, 3, 4), List.of(3, 4, 5)); + Stream numbers = Stream.of(1, 2, 3, 4, 5); + List> resultList = numbers.gather(new SlidingWindowGatherer()) + .toList(); + Assertions.assertEquals(3, resultList.size()); + Assertions.assertEquals(expectedOutput, resultList); + } + +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index f3ca14a30fce..08b2b801ee14 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -60,7 +60,7 @@ core-java-streams-4 core-java-streams-5 core-java-streams-6 - core-java-streams-7 + core-java-streams-collect core-java-streams-maps core-java-string-operations-3 diff --git a/pom.xml b/pom.xml index b3892e010c9b..3f7219009f22 100644 --- a/pom.xml +++ b/pom.xml @@ -951,6 +951,7 @@ + core-java-modules/core-java-streams-7 core-java-modules/core-java-24 @@ -1367,6 +1368,7 @@ + core-java-modules/core-java-streams-7 core-java-modules/core-java-24