diff --git a/core-java-modules/core-java-streams-maps/README.md b/core-java-modules/core-java-streams-maps/README.md
new file mode 100644
index 0000000000..729105e3fd
--- /dev/null
+++ b/core-java-modules/core-java-streams-maps/README.md
@@ -0,0 +1 @@
+## Relevant Articles:
diff --git a/core-java-modules/core-java-streams-maps/pom.xml b/core-java-modules/core-java-streams-maps/pom.xml
new file mode 100644
index 0000000000..06cc9ceef6
--- /dev/null
+++ b/core-java-modules/core-java-streams-maps/pom.xml
@@ -0,0 +1,67 @@
+
+
+ 4.0.0
+ core-java-streams-maps
+ 0.1.0-SNAPSHOT
+ core-java-streams-maps
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.junit
+ junit-bom
+ ${junit-jupiter.version}
+ pom
+ import
+
+
+ org.assertj
+ assertj-core
+ 3.23.1
+ test
+
+
+
+
+ core-java-streams-maps
+
+
+ src/main
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ -parameters
+
+
+
+
+
+
+
+ 3.1
+ 1.8
+ 1.8
+
+
+
diff --git a/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/tomap/StreamToMapDuplicatedKeysHandlingUnitTest.java b/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/tomap/StreamToMapDuplicatedKeysHandlingUnitTest.java
new file mode 100644
index 0000000000..7da8a16062
--- /dev/null
+++ b/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/tomap/StreamToMapDuplicatedKeysHandlingUnitTest.java
@@ -0,0 +1,97 @@
+package com.baeldung.streams.tomap;
+
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.toMap;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+import org.junit.jupiter.api.Test;
+
+class City {
+ private String name;
+ private String locatedIn;
+
+ public City(String name, String locatedIn) {
+ this.name = name;
+ this.locatedIn = locatedIn;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getLocatedIn() {
+ return locatedIn;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (!(o instanceof City))
+ return false;
+
+ City city = (City) o;
+
+ if (!name.equals(city.name))
+ return false;
+ return locatedIn.equals(city.locatedIn);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = name.hashCode();
+ result = 31 * result + locatedIn.hashCode();
+ return result;
+ }
+}
+
+public class StreamToMapDuplicatedKeysHandlingUnitTest {
+ // @formatter:off
+ private final List CITY_INPUT = Arrays.asList(
+ new City("New York City", "USA"),
+ new City("Shanghai", "China"),
+ new City("Hamburg", "Germany"),
+ new City("Paris", "France"),
+ new City("Paris", "Texas, USA"));
+ // @formatter:on
+
+ @Test
+ void givenCityList_whenUsingGroupingBy_shouldContainExpectedCity() {
+ Map> resultMap = CITY_INPUT.stream()
+ .collect(groupingBy(City::getName));
+ assertEquals(4, resultMap.size());
+ // @formatter:off
+ assertEquals(Arrays.asList(
+ new City("Paris", "France"),
+ new City("Paris", "Texas, USA")), resultMap.get("Paris"));
+ // @formatter:on
+
+ }
+
+ @Test
+ void givenCityList_whenContainingDuplicatedNamesUsingToMap_shouldContainExpectedCity() {
+ Map resultMap1 = CITY_INPUT.stream()
+ .collect(toMap(City::getName, Function.identity(), (first, second) -> first));
+ assertEquals(4, resultMap1.size());
+ assertEquals(new City("Paris", "France"), resultMap1.get("Paris"));
+
+ Map resultMap2 = CITY_INPUT.stream()
+ .collect(toMap(City::getName, Function.identity(), (first, second) -> second));
+ assertEquals(4, resultMap2.size());
+ assertEquals(new City("Paris", "Texas, USA"), resultMap2.get("Paris"));
+
+ Map resultMap3 = CITY_INPUT.stream()
+ .collect(toMap(City::getName, Function.identity(), (first, second) -> {
+ String locations = first.getLocatedIn() + " and " + second.getLocatedIn();
+ return new City(first.getName(), locations);
+ }));
+ assertEquals(4, resultMap2.size());
+ assertEquals(new City("Paris", "France and Texas, USA"), resultMap3.get("Paris"));
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index a96489ec6f..59d30c1600 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -120,6 +120,7 @@
core-java-streams
core-java-streams-2
core-java-streams-3
+ core-java-streams-maps
core-java-string-algorithms
core-java-string-algorithms-2
core-java-string-apis