Удаление повторяющихся записей о людях по фамилии с помощью Stream API

Соберите людей по ключу lastname в LinkedHashMap, при коллизии оставляя старое значение. Затем верните список values: так сохранятся первые представители и их порядок.

Короткий ответ

Что ответить на собеседовании

Соберите людей по ключу lastname в LinkedHashMap, при коллизии оставляя старое значение. Затем верните список values: так сохранятся первые представители и их порядок.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать метод distinctPersonByLastName, который:

  • отбирает элементы из переданного списка, оставляя только одну запись для каждой уникальной фамилии (lastname);
  • использует возможности Stream API для выполнения фильтрации;
  • сохраняет первое встретившееся значение фамилии и отбрасывает последующие дубликаты;
  • возвращает новый список, в котором нет повторов фамилий.
public List<Person> distinctPersonByLastName(List<Person> persons) {
}

@RequiredArgsConstructor
@EqualsAndHashCode
@Getter
public class Person{
  private final String firstname;
  private final String lastname;
}

Ответ

Соберите людей по ключу lastname в LinkedHashMap, при коллизии оставляя старое значение. Затем верните список values: так сохранятся первые представители и их порядок.

public List<Person> distinctPersonByLastName(List<Person> persons) {
    Map<String, Person> firstByName = persons.stream()
            .collect(java.util.stream.Collectors.toMap(
                    Person::getLastname,
                    java.util.function.Function.identity(),
                    (first, next) -> first,
                    java.util.LinkedHashMap::new));
    return new java.util.ArrayList<>(firstByName.values());
}

Предполагаются ненулевые Person; фамилии сравниваются с учётом регистра. Обычный distinct учитывал бы Lombok equals по обоим полям и не удалил бы людей с разными именами, но одной фамилией. Ожидаемое время O(n), память O(k).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее