From 8f32b5e359e6a875c1b3ec7d8b9a42e47c60a0ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Antonio=20Bre=C3=B1a=20Moral?= Date: Wed, 29 May 2024 16:07:09 +0000 Subject: [PATCH] Adding initial examples for streams --- .../info/jab/fp/stream/StreamExamples.java | 39 +++++++++++ .../gatherers/_10_collector_as_gatherer.java | 48 ------------- .../info/jab/fp/stream/gatherers/_11_map.java | 24 ------- .../fp/stream/gatherers/_12_windowFixed.java | 42 ----------- .../jab/fp/stream/gatherers/_13_fold.java | 31 -------- .../jab/fp/stream/gatherers/_14_reduce.java | 36 ---------- .../gatherers/_15_print_characteristics.java | 39 ----------- .../fp/stream/gatherers/_18_findIndex.java | 27 ------- .../stream/gatherers/_1_starting_thread.java | 29 -------- .../gatherers/_20_gatherer_windowBy.java | 54 -------------- .../gatherers/_21_windowByWithCollector.java | 70 ------------------- .../fp/stream/gatherers/_2_take_while.java | 27 ------- .../jab/fp/stream/gatherers/_3_limit.java | 34 --------- .../jab/fp/stream/gatherers/_4_groupBy2.java | 45 ------------ .../gatherers/_5_groupBy2_sequential.java | 44 ------------ .../fp/stream/gatherers/_6_filter_greedy.java | 27 ------- .../_7_groupBy2_sequential_greedy.java | 45 ------------ 17 files changed, 39 insertions(+), 622 deletions(-) create mode 100644 training/src/main/java/info/jab/fp/stream/StreamExamples.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_10_collector_as_gatherer.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_11_map.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_12_windowFixed.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_13_fold.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_14_reduce.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_15_print_characteristics.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_18_findIndex.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_1_starting_thread.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_20_gatherer_windowBy.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_21_windowByWithCollector.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_2_take_while.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_3_limit.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_4_groupBy2.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_5_groupBy2_sequential.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_6_filter_greedy.java delete mode 100644 training/src/main/java/info/jab/fp/stream/gatherers/_7_groupBy2_sequential_greedy.java diff --git a/training/src/main/java/info/jab/fp/stream/StreamExamples.java b/training/src/main/java/info/jab/fp/stream/StreamExamples.java new file mode 100644 index 0000000..f577187 --- /dev/null +++ b/training/src/main/java/info/jab/fp/stream/StreamExamples.java @@ -0,0 +1,39 @@ +package info.jab.fp.stream; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Gatherers; + +public class StreamExamples { + + public void example1() { + var text = """ + item1 + item2 + -- + item11 + item12 + """; + + var result = text.lines() + .gather(Gatherers.windowFixed(2)) + .toList(); + } + + public void example2() { + var text = """ + item1 + item2 + -- + item11 + item12 + """; + + var result = text.lines() + .gather(Gatherers.fold(() -> 0, (value, s) -> value + 1)) + .findFirst().orElseThrow(); + + System.out.println(result); + } + +} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_10_collector_as_gatherer.java b/training/src/main/java/info/jab/fp/stream/gatherers/_10_collector_as_gatherer.java deleted file mode 100644 index 0dace92..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_10_collector_as_gatherer.java +++ /dev/null @@ -1,48 +0,0 @@ -import java.util.List; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import java.util.stream.Gatherer; -import java.util.stream.Gatherers; - - Gatherer asGatherer(Collector collector) { - var supplier = collector.supplier(); - var accumulator = collector.accumulator(); - var combiner = collector.combiner(); - var finisher = collector.finisher(); - return Gatherer.of(supplier, - Gatherer.Integrator.ofGreedy((state, element, _) -> { - accumulator.accept(state, element); - return true; - }), - combiner, - (state, downstream) -> downstream.push(finisher.apply(state))); -} - - Collector asCollector(Gatherer gatherer) { - var initializer = gatherer.initializer(); - var integrator = gatherer.integrator(); - var combiner = gatherer.combiner(); - var finisher = gatherer.finisher(); - return Collector.of( - initializer, - (state, element) -> integrator.integrate(state, element, __ -> { throw new IllegalStateException(); }), - combiner, - state -> { - var box = new Object() { T result; }; - finisher.accept(state, value -> { box.result = value; return true; }); - return box.result; - }); -} - -void main() { - var list = List.of(1, 2, 3, 4, 5); - - var result = list.stream() - .gather(asGatherer(Collectors.toList())) - .findFirst().orElseThrow(); - System.out.println(result); - - var result2 = list.stream() - .collect(asCollector(Gatherers.fold(() -> 0, Integer::sum))); - System.out.println(result2); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_11_map.java b/training/src/main/java/info/jab/fp/stream/gatherers/_11_map.java deleted file mode 100644 index fee1bab..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_11_map.java +++ /dev/null @@ -1,24 +0,0 @@ -import java.util.stream.Gatherer; - -Gatherer map() { - return Gatherer.of(Gatherer.Integrator.ofGreedy((_, element, downstream) -> { - return downstream.push(element.length()); - })); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.map(String::length) - .gather(map()) - .toList(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_12_windowFixed.java b/training/src/main/java/info/jab/fp/stream/gatherers/_12_windowFixed.java deleted file mode 100644 index 328a9ec..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_12_windowFixed.java +++ /dev/null @@ -1,42 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Gatherer; - -Gatherer> windowFixed() { - return Gatherer.ofSequential( - () -> new Object() { List list = new ArrayList<>(); }, - Gatherer.Integrator.ofGreedy((state, element, downstream) -> { - if (state.list.size() == 2) { - if (!downstream.push(state.list)) { - return false; - } - state.list = new ArrayList<>(); - } - state.list.add(element); - return true; - }), - (state, downstream) -> { - if (!state.list.isEmpty()) { - downstream.push(state.list); - } - state.list = null; // maybe ? - } - ); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.gather(Gatherers.windowFixed(2)) - .gather(windowFixed()) - .toList(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_13_fold.java b/training/src/main/java/info/jab/fp/stream/gatherers/_13_fold.java deleted file mode 100644 index c7e08bd..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_13_fold.java +++ /dev/null @@ -1,31 +0,0 @@ -import java.util.stream.Gatherer; - -Gatherer fold() { - return Gatherer.ofSequential( - () -> new Object() { int counter; }, - Gatherer.Integrator.ofGreedy((state, _, _) -> { - state.counter++; - return true; - }), - (state, downstream) -> { - downstream.push(state.counter); - } - ); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.gather(Gatherers.fold(() -> 0, (value, s) -> value + 1)) - .gather(fold()) - .findFirst().orElseThrow(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_14_reduce.java b/training/src/main/java/info/jab/fp/stream/gatherers/_14_reduce.java deleted file mode 100644 index b36a705..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_14_reduce.java +++ /dev/null @@ -1,36 +0,0 @@ -import java.util.stream.Gatherer; - -Gatherer reduce() { - class Counter { - int counter; - Counter(int counter) { - this.counter = counter; - } - } - return Gatherer.of( - () -> new Counter(0), - Gatherer.Integrator.ofGreedy((state, _, _) -> { - state.counter++; - return true; - }), - (s1, s2) -> new Counter(s1.counter + s2.counter), - (state, downstream) -> downstream.push(state.counter) - ); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - .parallel() - .gather(reduce()) - .findFirst().orElseThrow(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_15_print_characteristics.java b/training/src/main/java/info/jab/fp/stream/gatherers/_15_print_characteristics.java deleted file mode 100644 index cea0793..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_15_print_characteristics.java +++ /dev/null @@ -1,39 +0,0 @@ -import java.util.EnumSet; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Gatherer; -import java.util.stream.Gatherers; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.joining; - -enum Characteristic { - SEQUENTIAL, STATELESS, GREEDY -} - -Set characteristics(Gatherer gatherer) { - return Stream.of(gatherer) - .mapMulti((g, consumer) -> { - if (g.combiner() == Gatherer.defaultCombiner()) { - consumer.accept(Characteristic.SEQUENTIAL); - } - if (g.initializer() == Gatherer.defaultInitializer()) { - consumer.accept(Characteristic.STATELESS); - } - if (g.integrator() instanceof Gatherer.Integrator.Greedy) { - consumer.accept(Characteristic.GREEDY); - } - }) - .collect(Collectors.toCollection(() -> EnumSet.noneOf(Characteristic.class))); -} - -void main() { - // Gatherers - System.out.println("fold: " + characteristics(Gatherers.fold(() -> null, (_, _) -> null))); - System.out.println("scan: " + characteristics(Gatherers.scan(() -> null, (_, _) -> null))); - System.out.println("mapConcurrent: " + characteristics(Gatherers.mapConcurrent(10, _ -> null))); - System.out.println("windowFixed: " + characteristics(Gatherers.windowFixed(2))); - System.out.println("windowSliding: " + characteristics(Gatherers.windowSliding(2))); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_18_findIndex.java b/training/src/main/java/info/jab/fp/stream/gatherers/_18_findIndex.java deleted file mode 100644 index cf31ed9..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_18_findIndex.java +++ /dev/null @@ -1,27 +0,0 @@ -import java.lang.foreign.Arena; -import java.util.Objects; -import java.util.function.Predicate; -import java.util.stream.Gatherer; - -import static java.util.stream.Gatherer.Integrator.ofGreedy; - - Gatherer findIndex(Predicate predicate) { - Objects.requireNonNull(predicate); - return Gatherer.ofSequential( - () -> new Object() { int index; }, - ofGreedy((state, element, downstream) -> { - var index = state.index++; - if (predicate.test(element)) { - return downstream.push(index); - } - return true; - })); -} - -void main() { - var list = java.util.List.of("foo", "bar", "baz"); - var findIndex = list.stream().gather(findIndex(s -> s.contains("o"))).findFirst().orElse(-1); - System.out.println(findIndex); - var findLastIndex = list.reversed().stream().gather(findIndex(s -> s.contains("o"))).findFirst().orElse(-1); - System.out.println(findLastIndex); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_1_starting_thread.java b/training/src/main/java/info/jab/fp/stream/gatherers/_1_starting_thread.java deleted file mode 100644 index e35bfcd..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_1_starting_thread.java +++ /dev/null @@ -1,29 +0,0 @@ -import java.util.stream.Gatherer; - -Gatherer filter() { - return Gatherer.of((_, element, downstream) -> { - if (element.endsWith("1")) { - return downstream.push(element); - } - return true; - }); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.filter(s -> s.endsWith("1")) - .gather(filter()) - .toList(); - - System.out.println(result); -} - - diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_20_gatherer_windowBy.java b/training/src/main/java/info/jab/fp/stream/gatherers/_20_gatherer_windowBy.java deleted file mode 100644 index fd822da..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_20_gatherer_windowBy.java +++ /dev/null @@ -1,54 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Gatherer; - -record Section(String name, List items) {} - -Gatherer windowBy(Predicate predicate, - BiFunction, ? extends Section> mapper) { - class State { - List container; - String name; - } - return Gatherer.ofSequential( - State::new, - Gatherer.Integrator.ofGreedy((state, element, downstream) -> { - if (predicate.test(element)) { - if (state.container != null) { - if (!downstream.push(mapper.apply(state.name, state.container))) { - return false; - } - } - state.container = new ArrayList<>(); - state.name = element; - return true; - } - if (state.container == null) { - throw new IllegalStateException(); - } - state.container.add(element); - return true; - }), - (state, downstream) -> { - if (state.container != null) { - downstream.push(mapper.apply(state.name, state.container)); - } - }); -} - -void main() { - var text = """ - header - item1 - item2 - header2 - item3 - """; - - var sections = text.lines() - .gather(windowBy(s -> s.startsWith("header"), Section::new)) - .toList(); - System.out.println(sections); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_21_windowByWithCollector.java b/training/src/main/java/info/jab/fp/stream/gatherers/_21_windowByWithCollector.java deleted file mode 100644 index f411a46..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_21_windowByWithCollector.java +++ /dev/null @@ -1,70 +0,0 @@ -import java.util.List; -import java.util.Objects; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import java.util.stream.Gatherer; - -record Section(String name, List items) {} - - Gatherer windowBy(Predicate predicate, - Collector collector, - BiFunction mapper) { - return _windowBy(predicate, collector, mapper); -} - - Gatherer _windowBy(Predicate predicate, - Collector collector, - BiFunction mapper) { - Objects.requireNonNull(predicate); - Objects.requireNonNull(collector); - Objects.requireNonNull(mapper); - var supplier = collector.supplier(); - var accumulator = collector.accumulator(); - var finisher = collector.finisher(); - class State { - A container; - T element; - } - return Gatherer.ofSequential( - State::new, - Gatherer.Integrator.ofGreedy((state, element, downstream) -> { - if (predicate.test(element)) { - if (state.container != null) { - if (!downstream.push(mapper.apply(state.element, finisher.apply(state.container)))) { - return false; - } - } - state.container = supplier.get(); - state.element = element; - return true; - } - if (state.container == null) { - throw new IllegalStateException(""); - } - accumulator.accept(state.container, element); - return true; - }), - (state, downstream) -> { - if (state.container != null) { - downstream.push(mapper.apply(state.element, finisher.apply(state.container))); - } - } - ); -} - -void main() { - var text = """ - header - item1 - item2 - header2 - item3 - """; - - var sections = text.lines() - .gather(windowBy(s -> s.startsWith("header"), Collectors.toList(), Section::new)) - .toList(); - System.out.println(sections); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_2_take_while.java b/training/src/main/java/info/jab/fp/stream/gatherers/_2_take_while.java deleted file mode 100644 index 1ffe110..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_2_take_while.java +++ /dev/null @@ -1,27 +0,0 @@ -import java.util.stream.Gatherer; - -Gatherer takeWhile() { - return Gatherer.of((_, element, downstream) -> { - if (element.startsWith("item")) { - return downstream.push(element); - } - return false; - }); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.takeWhile(s -> s.startsWith("item")) - .gather(takeWhile()) - .toList(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_3_limit.java b/training/src/main/java/info/jab/fp/stream/gatherers/_3_limit.java deleted file mode 100644 index bddfe2b..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_3_limit.java +++ /dev/null @@ -1,34 +0,0 @@ -import java.util.stream.Gatherer; - -Gatherer limit() { - class Counter { - int counter; - Counter(int counter) { this.counter = counter; } - } - return Gatherer.ofSequential( - () -> new Counter(0), - (counter, element, downstream) -> { - if (counter.counter++ == 3) { - return false; - } - return downstream.push(element); - } - ); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.limit(3) - .gather(limit()) - .toList(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_4_groupBy2.java b/training/src/main/java/info/jab/fp/stream/gatherers/_4_groupBy2.java deleted file mode 100644 index aa71f07..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_4_groupBy2.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Gatherer; -import java.util.stream.Gatherers; - -Gatherer> groupBy2() { - class State { - ArrayList list = new ArrayList<>(); - } - return Gatherer.of( - State::new, - (state, element, downstream) -> { - var list = state.list; - list.add(element); - if (state.list.size() == 2) { - state.list = new ArrayList<>(); - return downstream.push(list); - } - return true; - }, - (_, _) -> { throw new UnsupportedOperationException(); }, // oops ! - (state, downstream) -> { - if (!state.list.isEmpty()) { - downstream.push(state.list); - } - } - ); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.gather(Gatherers.windowFixed(2) - .gather(groupBy2()) - .toList(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_5_groupBy2_sequential.java b/training/src/main/java/info/jab/fp/stream/gatherers/_5_groupBy2_sequential.java deleted file mode 100644 index be9c443..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_5_groupBy2_sequential.java +++ /dev/null @@ -1,44 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Gatherer; -import java.util.stream.Gatherers; - -Gatherer> groupBy2() { - class State { - ArrayList list = new ArrayList<>(); - } - return Gatherer.ofSequential( // inherently sequential - State::new, - (state, element, downstream) -> { - var list = state.list; - list.add(element); - if (state.list.size() == 2) { - state.list = new ArrayList<>(); - return downstream.push(list); - } - return true; - }, - (state, downstream) -> { - if (!state.list.isEmpty()) { - downstream.push(state.list); - } - } - ); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.gather(Gatherers.windowFixed(2) - .gather(groupBy2()) - .toList(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_6_filter_greedy.java b/training/src/main/java/info/jab/fp/stream/gatherers/_6_filter_greedy.java deleted file mode 100644 index 59c0c35..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_6_filter_greedy.java +++ /dev/null @@ -1,27 +0,0 @@ -import java.util.stream.Gatherer; - -Gatherer filter() { - return Gatherer.of(Gatherer.Integrator.ofGreedy((_, element, downstream) -> { // ofGreedy: optimization - if (element.endsWith("1")) { - return downstream.push(element); - } - return true; - })); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.filter(s -> s.endsWith("1")) - .gather(filter()) - .toList(); - - System.out.println(result); -} diff --git a/training/src/main/java/info/jab/fp/stream/gatherers/_7_groupBy2_sequential_greedy.java b/training/src/main/java/info/jab/fp/stream/gatherers/_7_groupBy2_sequential_greedy.java deleted file mode 100644 index 6f26552..0000000 --- a/training/src/main/java/info/jab/fp/stream/gatherers/_7_groupBy2_sequential_greedy.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Gatherer; -import java.util.stream.Gatherer.Integrator; -import java.util.stream.Gatherers; - -Gatherer> groupBy2() { - class State { - ArrayList list = new ArrayList<>(); - } - return Gatherer.ofSequential( // inherently sequential - State::new, - Integrator.ofGreedy((state, element, downstream) -> { - var list = state.list; - list.add(element); - if (state.list.size() == 2) { - state.list = new ArrayList<>(); - return downstream.push(list); - } - return true; - }), - (state, downstream) -> { - if (!state.list.isEmpty()) { - downstream.push(state.list); - } - } - ); -} - -void main() { - var text = """ - item1 - item2 - -- - item11 - item12 - """; - - var result = text.lines() - //.gather(Gatherers.windowFixed(2) - .gather(groupBy2()) - .toList(); - - System.out.println(result); -}