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.
Advertisement
Answer
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()));