handle duplicate key in Collectors.toMap() function

  • A+

I am creating a map which its (key,value) will be (name, address) in my Person object:

Map<String, String> myMap = persons.stream.collect(Collector.toMap(person.getName(), person.getAddress(), (address1, address2) -> address1)); 

In the duplicate key situation, I would like to skip to add the second address to the map and would like to log the name also. Skipping the duplicate address I can do already using mergeFunction, but in oder to log the name I need in this mergeFunction the person object, something like:

    (address1, address2) -> {                                System.out.println("duplicate "+person.name() + " is found!");                                return address1;                            } 

I am getting stuck by passing person object to this merge function. Can anyone give me here some hints please? Thank you in advanced!


if you want to access the whole person object in the merge function then pass Function.identity() for the valueMapper:

Map<String, Person> myMap =          persons.stream()                .collect(toMap(p -> p.getName(),                        Function.identity(), // or p -> p                      (p1, p2) -> { /* do logic */ })); 

But as you can see the resulting map values are Person objects, if you still want a Map<String, String> as a result and still access the whole Person object in the mergeFunction then you can do the following:

 persons.stream()          .collect(toMap(p -> p.getName(), Function.identity(),(p1, p2) -> { /* do logic */ }))          .entrySet()          .stream()          .collect(toMap(Map.Entry::getKey, p -> p.getValue().getAddress())); 


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: