LeeWay:
Punto de partida:
public class Employee {
private String id;
private String name;
private String age;
}
Tengo una lista de los empleados: List<Employee> employee;
ejemplos de los empleados de la lista:
{id="1", name="John", age=10}
{id="2", name="Ana", age=12}
{id="3", name="John", age=23}
{id="4", name="John", age=14}
Asumamos que age
es único.
¿Cómo puedo eliminar todos los duplicados de la lista basada en la name
propiedad y tener en la salida de la entrada con el más grande age
?
La salida debe ser similar a:
{id="2", name="Ana", age=12}
{id="3", name="John", age=23}
La forma en que probé :
HashSet<Object> temp = new HashSet<>();
employee.removeIf(e->!temp.add(e.getName()));
..pero esta manera el primer partido se mantuvo en employee
{id="1", name="John", age=10}
{id="2", name="Ana", age=12}
... y no tengo ni idea de cómo poner otra condición para mantener el uno con el más grande age
.
ernest_k:
Aquí está una manera que agrupa elementos por name
y reduce los grupos seleccionando el uno con un máximo de age
:
List<Employee> uniqueEmployees = employees.stream()
.collect(Collectors.groupingBy(Employee::getName,
Collectors.maxBy(Comparator.comparing(Employee::getAge))))
.values()
.stream()
.map(Optional::get)
.collect(Collectors.toList());
Que vuelve [[id=2, name=Ana, age=12], [id=3, name=John, age=23]]
con sus datos de prueba.