我有一个类型的对象列表,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添加以下代码后,类的实现工作即可:@Overridepublic int hashCode(){ return person.getName().hashCode();}覆盖后有人可以解释为什么hashCode()在Wrapper类distinct()的作品?
3 回答
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
答案就在全班DistinctOps
。该方法makeRef
用于返回ReferencePipeline
包含不同元素的实例。此方法LinkedHashSet
用于执行reduce
操作以获得不同的元素。请注意,它从中LinkedHashSet
扩展用于存储元素。现在序的正常工作,你应该提供实现其遵循的正确合同和与therfore,需要您提供一个实现,使正常工作。HashSet
HashMap
HashMap
hashCode()
hashCode()
equals()
hasCode()
Stream#distinct()
添加回答
举报
0/150
提交
取消