Java 8 Different () не вызывает метод equals - PullRequest
1 голос
/ 18 июня 2019

В Java 8 документы для состояния промежуточной операции Different ()

Возвращает поток, состоящий из отдельных элементов (согласно> Object.equals (Object)) этого потока. Для упорядоченных потоков выбор отдельных элементов стабилен (для дублированных элементов элемент появляется первым

Но это не называется

Метод равных в моем классе предметов

@Override
public boolean equals(Object obj) {
    System.out.println(this.name+"<->"+((Item)obj).name);
    return this.name.equals(((Item)obj).name);
}

Определение данных в классе данных

public static List<Item> getItemList(){     
    itemData.add(new Item("Orange","Citrus Fruit","Orange",30,true,false));
    itemData.add(new Item("Apple Green","Universal Fruit","Green",60,false,true));
    itemData.add(new Item("Papaya","Wonderful Fruit","Yellow",120,false,true));
    itemData.add(new Item("Papaya","Wonderful Fruit","Green",100,false,true));
    .
    .
    .
    itemData.add(new Item("Strawberry","Citrus Fruit","Red",25,true,false));
    itemData.add(new Item("Sapota","Brown Fruit","Brown",32,false,true));

    return itemData;
}

Использование потоков

Data.getItemList().stream().distinct().forEach(System.out::println)

но я понимаю, что метод equals не называется

Ответы [ 2 ]

5 голосов
/ 18 июня 2019

Кроме equals(), вам также необходимо переопределить метод hashCode().Метод distinct(), вероятно, использует внутренний набор, что, в свою очередь, требует правильно реализованного hashCode().Подробнее инфо .

4 голосов
/ 18 июня 2019

Вы также переопределяете метод HashCode ??

Перегрузка невозможна для distinct. Если вы хотите предоставить собственную логику для сравнения, вам лучше использовать distinctBy API.

DistinctBy

...