web-dev-qa-db-fra.com

Stream et l'opération distincte

J'ai le code suivant:

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());

mais je ne comprends pas pourquoi distinct renvoie 3 et non 2.

30
xdevel2000

Vous devez également remplacer la méthode hashCode dans la classe C. Par exemple:

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

Lorsque deux objets C sont égaux, leurs méthodes hashCode doivent renvoyer la même valeur.

La documentation de l'API pour l'interface Stream ne le mentionne pas, mais il est bien connu que si vous remplacez equals, vous devez également remplacer hashCode. La documentation de l'API pour Object.equals() mentionne ceci:

Notez qu'il est généralement nécessaire de remplacer la méthode hashCode chaque fois que cette méthode est remplacée, afin de conserver le contrat général pour la méthode hashCode, qui stipule que les objets égaux doivent avoir des codes de hachage égaux.

Apparemment, Stream.distinct() utilise en effet le code de hachage des objets, car lorsque vous l'implémentez comme je l'ai montré ci-dessus, vous obtenez le résultat attendu: 2.

46
Jesper