我有一个类型的对象列表,Person我想使用流摆脱具有相同名称的元素。我在互联网上发现了使用Wrapper类的建议,到目前为止,我的代码看起来像这样:
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());
在文档中,据说 distinct()
返回由该流的不同元素组成的流(根据Object.equals(Object))。
那样的实现是Wrapper行不通的(我用两个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;
}
}
Wrapper添加以下代码后,类的实现工作即可:
@Override
public int hashCode()
{
return person.getName().hashCode();
}
覆盖后有人可以解释为什么hashCode()在Wrapper类distinct()的作品?
一只名叫tom的猫
相关分类