【发布时间】:2014-01-24 13:13:38
【问题描述】:
我有以下代码:
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。
【问题讨论】:
-
啊哈,您正在尝试使用 Java 8。也可以尝试在
C类中覆盖hashCode()。如果两个C对象相等,那么它们的哈希码必须相同。 -
在覆盖的
equals中放置一个断点,看看distinct是否考虑它。 -
@Jesper,我在download.java.net/jdk8/docs/api/java/util/stream/… 的文档中没有看到任何关于
hashcode的担忧 -
但它似乎最初在
hashcode上运行,因为这通常比equals检查更有效。而且由于它是一个通用合约,两个相等的对象必须具有相同的哈希值。因此,仅当hashcodes 相同时才执行equals检查是一个有效的解决方案。我相信这正是distinct所做的 -
但我不明白为什么
distinct返回3而不是2。,distinct应该是count。
标签: java java-8 java-stream