Соберите людей по ключу lastname в LinkedHashMap, при коллизии оставляя старое значение. Затем верните список values: так сохранятся первые представители и их порядок.
Удаление повторяющихся записей о людях по фамилии с помощью Stream API
Соберите людей по ключу 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).