流和不同的操作

时间:2014-01-24 13:13:38

标签: java java-8 java-stream

我有以下代码:

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。

1 个答案:

答案 0 :(得分:45)

您还需要覆盖班级hashCode中的C方法。例如:

@Override
public int hashCode() {
    return n.hashCode();
}

当两个C个对象相等时,它们的hashCode方法必须返回相同的值。

接口Stream的API文档没有提到这一点,但众所周知,如果覆盖equals,您还应该覆盖hashCodeObject.equals()的API文档提到了这一点:

  

请注意,一旦覆盖此方法,通常需要覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希码

显然,Stream.distinct()确实使用了对象的哈希码,因为当你像我上面显示的那样实现它时,你会得到预期的结果:2。