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