Подтвердить что ты не робот

Поток и отдельная операция

У меня есть следующий код:

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.

4b9b3361

Ответ 1

Вы также должны переопределить метод hashCode в классе C. Например:

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

Когда два объекта C равны, их методы hashCode должны возвращать одинаковое значение.

Документация API для интерфейса Stream не упоминает об этом, но хорошо известно, что если вы переопределяете equals, вы также должны переопределить hashCode. В документации API для Object.equals() упоминается следующее:

Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт для метода hashCode, который утверждает, что равные объекты должны иметь одинаковые хэш-коды.

По-видимому, Stream.distinct() действительно использует хэш-код объектов, потому что, когда вы реализуете его, как я показал выше, вы получаете ожидаемый результат: 2.