Для получения ожидаемого результата необходимо переопределить equals
и hashcode
.
Пример:
class Person {
private String name;
private String theOtherField;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return (name != null ? name.equals(person.name) : person.name == null) &&
(theOtherField != null ? theOtherField.equals(person.theOtherField) :
person.theOtherField == null);
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (theOtherField != null ? theOtherField.hashCode() : 0);
return result;
}
public Person(String name, String theOtherField) {
this.name = name;
this.theOtherField = theOtherField;
}
}
Теперь предположим, что у вас есть список таких людей, например:
List<Person> personList = Arrays.asList(new Person("nameA", "35"),
new Person("nameA", "35"));
Выполнение операции distinct
должно дать список с одним элементом.
List<Person> distinctPeople =
personList.stream()
.distinct()
.collect(Collectors.toList());
или вы можете собрать в реализацию Set
без использования distinct
следующим образом:
Set<Person> distinctPeople = new HashSet<>(personList);
Обратите внимание, я назвал одно из свойств в классе Person
theOtherField
, потому что я не знаю, представляет ли оно возраст человека или нет, поскольку в идеале возраст человека должен быть int
, а не String
.
Ваш класс Person должен переопределять equals.
dzone.com/articles/working-with-hashcode-and-equals-in-java
@Eran Я пытался переопределить equals, но похоже, что Different() не использует equals(), потому что он не работает. Спасибо за предложение
@Nazerke, скорее всего, вы неправильно переопределили
equals
иhashcode
. Я привел пример в своем ответе.