Взаимодействие со списками объектов – одна из распространенных задач в программировании на Java. Часто возникает необходимость убрать дубликаты из коллекции объектов, основываясь на каком-то свойстве объекта.
Возьмем, к примеру, список объектов класса Person
, где каждый объект имеет свойства name
и age
. Предположим, требуется убрать из списка все дубликаты по имени.
List<Person> persons = new ArrayList<>(); persons.add(new Person("John", 25)); persons.add(new Person("John", 30)); persons.add(new Person("Anna", 20)); persons.add(new Person("Anna", 22));
В таком списке есть два объекта с именем «John» и два объекта с именем «Anna». Цель — оставить в списке только уникальные имена.
В Java 8 для работы со списками предусмотрен потоковый API, который предоставляет метод distinct()
. Однако, этот метод работает с учетом всех свойств объекта.
List<Person> distinctPersons = persons.stream().distinct().collect(Collectors.toList());
Такой код не решает задачу, так как в итоговом списке все еще присутствуют объекты с одинаковыми именами.
Для решения этой задачи можно использовать комбинацию методов collect
и toMap
.
List<Person> distinctPersons = new ArrayList<>( persons.stream() .collect(Collectors.toMap( Person::getName, // ключ карты p -> p, // значение карты (p1, p2) -> p1 // при совпадении ключей, выбирается первый попавшийся )) .values() );
В данном случае, строится карта, где ключом является имя объекта Person
, а значением — сам объект. Если встречаются объекты с одинаковыми ключами, то выбирается первый. В итоге получается список объектов без дубликатов по имени.
Таким образом, можно использовать метод collect
и toMap
для удаления дубликатов по определенному свойству объекта в списке.
Добавить комментарий