Вебинары Разобраться в IT Реферальная программа Тесты
Программирование Аналитика Дизайн Маркетинг Управление проектами
11 Сен 2023
2 мин
482

Удаление дубликатов в коллекции объектов по свойству в Java 8

Пройдите тест, узнайте какой профессии подходите

Взаимодействие со списками объектов – одна из распространенных задач в программировании на Java. Часто возникает необходимость убрать дубликаты из

Взаимодействие со списками объектов – одна из распространенных задач в программировании на 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 для удаления дубликатов по определенному свойству объекта в списке.

Добавить комментарий