I have a list of objects of type Person
and I want to get rid of elements that have the same name, using streams. I have found on the internet a suggestion to use a Wrapper class and my code looks like this so far:
List<Person> people = Arrays.asList(new Person("Kowalski"),
new Person("Nowak"),
new Person("Big"),
new Person("Kowalski"));
List<Person> distPeople = people.stream()
.map(Wrapper::new)
.distinct()
.map(Wrapper::unwrap)
.collect(Collectors.toList());
In documentation it is said that distinct()
Returns a stream consisting of the distinct elements (according to Object.equals(Object)) of this stream.
Implementation of Wrapper
that doesn't work (I get the same stream with two Kowalski):
public class Wrapper
{
private final Person person;
Wrapper(Person p)
{
person = p;
}
public Person unwrap()
{
return person;
}
public boolean equals(Object other)
{
if(other instanceof Wrapper)
return ((Wrapper) other).person.getName().equals(person.getName());
else
return false;
}
}
Implementation of Wrapper
class works after adding this:
@Override
public int hashCode()
{
return person.getName().hashCode();
}
Can someone explain why after overriding hashCode()
in the Wrapper
class distinct()
works?