Как упоминалось в комментарии, на картах не хранятся дублированные ключи, поэтому вы должны использовать Map<String, List<String>>
вместо Map<String, String>
.
Чтобы подвести итог, вам просто нужно использовать метод Collectors.toMap
с параметром mergeFunction
, где вы можете обрабатывать дублированные ключи. Эта операция будет вызываться каждый раз, когда появляются одинаковые клавиши. В этом случае мы просто объединяем два списка в один. Посмотрите на приведенный ниже код (скомпилированный с JDK 11), я считаю, что он делает именно то, что вам нужно, и печатает ожидаемый результат (конечно, используя List<String>
).
import java.util.*;
import java.util.stream.Collectors;
public class ListToMapWithDuplicatedKeysSample {
public static void main(String[] args) {
List<Address> addresses = List.of(
new Address("City1", "country1", "state1"),
new Address("City1", "country1", "state2"),
new Address("City1", "country1", "state1"),
new Address("City3", "country3", "state3")
);
Map<String, List<String>> result = addresses.stream()
.collect(
Collectors.toMap(
address -> address.getCity() + address.getCountry(),
address -> Collections.singletonList(address.getState()),
ListToMapWithDuplicatedKeysSample::mergeEntriesWithDuplicatedKeys
)
);
System.out.println(result);
}
private static List<String> mergeEntriesWithDuplicatedKeys(List<String> existingResults, List<String> newResults) {
List<String> mergedResults = new ArrayList<>();
mergedResults.addAll(existingResults);
mergedResults.addAll(newResults);
return mergedResults;
}
private static class Address {
private final String city;
private final String country;
private final String state;
public Address(String city, String country, String state) {
this.city = city;
this.country = country;
this.state = state;
}
String getState() {
return state;
}
String getCountry() {
return country;
}
String getCity() {
return city;
}
}
}