From 96efb4bf4ac51f5bcb4d241969bf5346b77f261a Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 9 Mar 2023 02:37:48 +0100 Subject: [PATCH] =?UTF-8?q?[stream-2maap-dup-keys]=20Handle=20Duplicated?= =?UTF-8?q?=20Keys=20When=20Producing=20Map=20Usi=E2=80=A6=20(#13546)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [stream-2maap-dup-keys] Handle Duplicated Keys When Producing Map Using Java Streamt * [stream-2maap-dup-keys] create the *-streams-maps module * [stream-2maap-dup-keys] add the new moudle to the parent pom --- .../core-java-streams-maps/README.md | 1 + .../core-java-streams-maps/pom.xml | 67 +++++++++++++ ...amToMapDuplicatedKeysHandlingUnitTest.java | 97 +++++++++++++++++++ core-java-modules/pom.xml | 1 + 4 files changed, 166 insertions(+) create mode 100644 core-java-modules/core-java-streams-maps/README.md create mode 100644 core-java-modules/core-java-streams-maps/pom.xml create mode 100644 core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/tomap/StreamToMapDuplicatedKeysHandlingUnitTest.java 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