Skip to content

Commit c17069a

Browse files
feat: added initalizer, integrator, combiner, finisher example
1 parent 654d397 commit c17069a

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

src/main/java/de/claudioaltamura/java23/streamgatherer/StreamGathererExample.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package de.claudioaltamura.java23.streamgatherer;
22

3+
import java.util.Comparator;
34
import java.util.List;
45
import java.util.ArrayList;
6+
import java.util.Optional;
57
import java.util.concurrent.atomic.AtomicInteger;
8+
import java.util.concurrent.atomic.AtomicReference;
69
import java.util.function.Function;
710
import java.util.stream.Gatherer;
811
import java.util.stream.Gatherers;
@@ -85,4 +88,51 @@ public List<List<String>> groupWords(List<String> words, int groupSize) {
8588
.gather(windowing(groupSize))
8689
.toList();
8790
}
88-
}
91+
92+
public <T> Gatherer<T, AtomicReference<T>, T> maximumBy(Comparator<T> comparator) {
93+
return Gatherer.of(
94+
// Initializer
95+
AtomicReference::new,
96+
97+
// Integrator
98+
Gatherer.Integrator.ofGreedy(
99+
(state, element, downstream) -> {
100+
T bestElement = state.get();
101+
if (bestElement == null || comparator.compare(element, bestElement) > 0) {
102+
state.set(element);
103+
}
104+
return true;
105+
}),
106+
107+
// Combiner
108+
(state1, state2) -> {
109+
T bestElement1 = state1.get();
110+
T bestElement2 = state2.get();
111+
112+
if (bestElement1 == null) {
113+
return state2;
114+
} else if (bestElement2 == null) {
115+
return state1;
116+
} else if (comparator.compare(bestElement1, bestElement2) > 0) {
117+
return state1;
118+
} else {
119+
return state2;
120+
}
121+
},
122+
123+
// Finisher
124+
(state, downstream) -> {
125+
T bestElement = state.get();
126+
if (bestElement != null) {
127+
downstream.push(bestElement);
128+
}
129+
});
130+
}
131+
132+
public Optional<String> getLongest(List<String> words) {
133+
return words.parallelStream()
134+
.gather(maximumBy(Comparator.comparing(String::length)))
135+
.findFirst();
136+
}
137+
138+
}

src/test/java/de/claudioaltamura/java23/streamgatherer/StreamGathererExampleTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,9 @@ void groupWords() {
4444
assertThat(result.get(1)).contains("world", "You");
4545
assertThat(result.getLast()).contains("are", "nice");
4646
}
47+
48+
@Test
49+
void getLongest() {
50+
assertThat(streamGathererExample.getLongest(List.of("Hello", "beautiful", "world")).get()).isEqualTo("beautiful");
51+
}
4752
}

0 commit comments

Comments
 (0)