我有包含员工详细信息的对象数组列表。我需要根据员工 ID 找到重复的员工,并使用创建日期删除旧员工的详细信息。
我需要使用 Google Guava 或 Apache Commons Collection 来执行此操作。
我有包含员工详细信息的对象数组列表。我需要根据员工 ID 找到重复的员工,并使用创建日期删除旧员工的详细信息。
我需要使用 Google Guava 或 Apache Commons Collection 来执行此操作。
如果您没有被迫使用 Google Guava 或 Apache Commons Collection,只需使用 Java 8(使用 Integer 作为 id,但可以是任何东西):
Map<Integer, List<Employee>> employeeMap = employees.stream()
.collect(Collectors.groupingBy(Employee::getId));
List<Employee> filtered = collect.entrySet().stream()
.map(e -> Collections.max(e.getValue(), Comparator.comparing(Employee::getCreatedDate)))
.collect(Collectors.toList());
如果您需要使用 Guava,这应该可以:
Map<Integer, Collection<Employee>> employeeMap = Multimaps.index(employees, Employee::getId).asMap();
Collection<Employee> filtered = Maps.transformValues(employeeMap, l -> Ordering.from(Comparator.comparing(Employee::getCreatedDate)).max(l)).values();
我认为您不需要为此使用 Guava 或 Apache Collections。
您可以简单地创建员工 ID 到员工详细信息的映射,然后对其进行更新以获取最近创建的员工详细信息:
LinkedHashMap<EmployeeId, EmployeeDetails> map = new LinkedHashMap<>();
for (EmployeeDetails details : list) {
if (!map.containsKey(details.getEmployeeId())) {
map.put(details.getEmployeeId(), details);
} else {
EmployeeDetails previous = map.get(details.getEmployeeId());
if (previous.getCreatedDate().before(details.getCreatedDate())) {
map.put(details.getEmployeeId(), details);
}
}
}
List<EmployeeDetails> deduplicated = new ArrayList<>(map.values());