diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml
index 4ba06f7c0d..f22d0a3ed9 100644
--- a/core-java-9/pom.xml
+++ b/core-java-9/pom.xml
@@ -19,11 +19,23 @@
${awaitility.version}
test
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
com.google.guava
guava
${guava.version}
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
+
@@ -50,6 +62,8 @@
+ 3.10.0
+ 1.2.0
1.7.0
1.9
1.9
diff --git a/core-java-9/src/main/java/com/baeldung/java9/language/stream/StreamsGroupingCollectionFilter.java b/core-java-9/src/main/java/com/baeldung/java9/language/stream/StreamsGroupingCollectionFilter.java
new file mode 100644
index 0000000000..84d2e63c6c
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/java9/language/stream/StreamsGroupingCollectionFilter.java
@@ -0,0 +1,27 @@
+package com.baeldung.java9.language.stream;
+
+import static java.util.stream.Collectors.filtering;
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.toList;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+public class StreamsGroupingCollectionFilter {
+
+ static public Map> findEvenNumbersAfterGroupingByQuantityOfDigits(Collection baseCollection) {
+ Function getQuantityOfDigits = item -> (int) Math.log10(item) + 1;
+
+ return baseCollection.stream()
+ .collect(groupingBy(getQuantityOfDigits, filtering(item -> item % 2 == 0, toList())));
+ }
+
+ static public Map> findEvenNumbersBeforeGroupingByQuantityOfDigits(Collection baseCollection) {
+
+ return baseCollection.stream()
+ .filter(item -> item % 2 == 0)
+ .collect(groupingBy(item -> (int) Math.log10(item) + 1, toList()));
+ }
+}
diff --git a/core-java-9/src/test/java/com/baeldung/java9/language/stream/CollectionFilterUnitTest.java b/core-java-9/src/test/java/com/baeldung/java9/language/stream/CollectionFilterUnitTest.java
new file mode 100644
index 0000000000..0a6424fa81
--- /dev/null
+++ b/core-java-9/src/test/java/com/baeldung/java9/language/stream/CollectionFilterUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.java9.language.stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+
+@RunWith(JUnitPlatform.class)
+public class CollectionFilterUnitTest {
+
+ private static final Collection BASE_INTEGER_COLLECTION = Arrays.asList(9, 12, 55, 56, 101, 115, 8002, 223, 2668, 19, 8);
+ private static final Map> EXPECTED_EVEN_FILTERED_AFTER_GROUPING_MAP = createExpectedFilterAfterGroupingMap();
+
+ private static Map> createExpectedFilterAfterGroupingMap() {
+ Map> map = new HashMap<>();
+ map.put(1, Arrays.asList(8));
+ map.put(2, Arrays.asList(12, 56));
+ map.put(3, Collections.emptyList());
+ map.put(4, Arrays.asList(8002, 2668));
+ return map;
+
+ }
+
+ private static final Map> EXPECTED_EVEN_FILTERED_BEFORE_GROUPING_MAP = createExpectedFilterBeforeGroupingMap();
+
+ private static Map> createExpectedFilterBeforeGroupingMap() {
+ Map> map = new HashMap<>();
+ map.put(1, Arrays.asList(8));
+ map.put(2, Arrays.asList(12, 56));
+ map.put(4, Arrays.asList(8002, 2668));
+ return map;
+
+ }
+
+ @Test
+ public void givenAStringCollection_whenFilteringFourLetterWords_thenObtainTheFilteredCollection() {
+ Map> filteredAfterGroupingMap = StreamsGroupingCollectionFilter.findEvenNumbersAfterGroupingByQuantityOfDigits(BASE_INTEGER_COLLECTION);
+ Map> filteredBeforeGroupingMap = StreamsGroupingCollectionFilter.findEvenNumbersBeforeGroupingByQuantityOfDigits(BASE_INTEGER_COLLECTION);
+
+ assertThat(filteredAfterGroupingMap).containsAllEntriesOf(EXPECTED_EVEN_FILTERED_AFTER_GROUPING_MAP);
+ assertThat(filteredBeforeGroupingMap).doesNotContainKey(3)
+ .containsAllEntriesOf(EXPECTED_EVEN_FILTERED_BEFORE_GROUPING_MAP);
+ }
+
+}