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