我有以下代码:
class C
{
String n;
C(String n)
{
this.n = n;
}
public String getN() { return n; }
@Override
public boolean equals(Object obj)
{
return this.getN().equals(((C)obj).getN());
}
}
List<C> cc = Arrays.asList(new C("ONE"), new C("TWO"), new C("ONE"));
System.out.println(cc.parallelStream().distinct().count());
但我不明白为什么distinct
会返回3而不是2。
答案 0 :(得分:45)
您还需要覆盖班级hashCode
中的C
方法。例如:
@Override
public int hashCode() {
return n.hashCode();
}
当两个C
个对象相等时,它们的hashCode
方法必须返回相同的值。
接口Stream
的API文档没有提到这一点,但众所周知,如果覆盖equals
,您还应该覆盖hashCode
。 Object.equals()
的API文档提到了这一点:
请注意,一旦覆盖此方法,通常需要覆盖
hashCode
方法,以便维护hashCode
方法的常规协定,该方法声明相等对象必须具有相等的哈希码
显然,Stream.distinct()
确实使用了对象的哈希码,因为当你像我上面显示的那样实现它时,你会得到预期的结果:2。