Удалить повторяющиеся записи из списка и сохранить последнюю обновленную запись LocalDate - PullRequest
0 голосов
/ 27 марта 2020

У меня есть класс сотрудников со следующими полями.

class Employee {
    final int id;
    final String name;
    final LocalDate updatedDate;
    // setters and getters
}

У меня есть список сотрудников, список может содержать дубликатов сотрудников с разными updatedDate. Теперь я хочу создать набор таким образом, чтобы он имел уникальную запись для каждого employeeId. если есть повторяющиеся записи, следует сохранить ту, которая имеет самую последнюю updatedDate.

Я пришел с предложенным ниже решением, отсортировал по updatedDate и добавил TreeSet, который поддерживает уникальность Id. Я мог бы использовать HashSet, реализовав хэш-код & equals в Employee.

List<Employee> employees = new ArrayList<>();

// sort
List<Employee> sortedList = employees.stream()
       .sorted(Collections.reverseOrder(Comparator.comparing(employee -> employee.updatedDate)))
       .collect(Collectors.toList());

Set<Employee> employeeSet = new TreeSet<>(Comparator.comparing( employee -> employee.id));
sortedList.forEach(employeeSet::add);

Теперь проблема, в большинстве случаев список сотрудников будет содержать уникальные элементы. очень редко встречаются повторяющиеся записи. Сортировка, когда присутствуют только уникальные записи, будет плохо масштабироваться. Есть ли способ улучшить вышеуказанное решение, избегая сортировки?

1 Ответ

2 голосов
/ 27 марта 2020

Другой способ решения этого вопроса - использовать groupingBy сборщик, а затем использовать collectingAndThen сборщик, чтобы найти самую последнюю версию updatedDate. Я думаю, что этот способ более читабелен и чист.

для упрощения я импортировал коллекторы как stati c.

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.maxBy;
import static java.util.stream.Collectors.groupingBy;

Collection<Employee> collection = employees.stream()
         .collect(groupingBy(Employee::getId,
             collectingAndThen(maxBy(Comparator.comparing(Employee::getUpdatedDate)),
                            employee -> employee.orElse(null)))).values();

, а затем

List<Employee> result = new ArrayList<>(collection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...