diff --git a/src/test/java/streams/part2/exercise/Exercise3.java b/src/test/java/streams/part2/exercise/Exercise3.java new file mode 100644 index 0000000..2871a68 --- /dev/null +++ b/src/test/java/streams/part2/exercise/Exercise3.java @@ -0,0 +1,90 @@ +package streams.part2.exercise; + +import org.junit.jupiter.api.Test; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collector; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.joining; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +@SuppressWarnings({"unused", "ConstantConditions"}) +class Exercise3 { + + @Test + void createLimitedStringWithOddNumbersSeparatedBySpaces() { + int countNumbers = 10; + + String result = Stream.iterate(1, i -> i + 1) + .filter(isOddNumber()) + .limit(countNumbers) + .map(String::valueOf) + .collect(joining(" ")); + + assertThat(result, is("1 3 5 7 9 11 13 15 17 19")); + } + + @Test + void extractEvenNumberedCharactersToNewString() { + String source = "abcdefghijklm"; + + String result = Stream.iterate(0, i -> i + 1) + .limit(source.length()) + .filter(isEvenNumber()) + .map(source::charAt) + .collect(new CharJoining()); + + assertThat(result, is("acegikm")); + } + + private static class CharJoining implements Collector { + + private HashSet characteristics; + + public CharJoining() { + characteristics = new HashSet<>(); + characteristics.add(Characteristics.CONCURRENT); + } + + @Override + public Supplier supplier() { + return StringBuffer::new; + } + + @Override + public BiConsumer accumulator() { + return StringBuffer::append; + } + + @Override + public BinaryOperator combiner() { + return StringBuffer::append; + } + + @Override + public Function finisher() { + return StringBuffer::toString; + } + + @Override + public Set characteristics() { + return characteristics; + } + } + + private static Predicate isOddNumber() { + return n -> n % 2 == 1; + } + + private static Predicate isEvenNumber() { + return n -> n % 2 == 0; + } +}