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.
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éthodehashCode
, 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.