
ricak
En Java 8, ¿cómo puedo filtrar una colección usando el Stream
API comprobando la distinción de una propiedad de cada objeto?
Por ejemplo, tengo una lista de Person
objeto y quiero eliminar personas con el mismo nombre,
persons.stream().distinct();
Utilizará la verificación de igualdad predeterminada para un Person
objeto, así que necesito algo como,
persons.stream().distinct(p -> p.getName());
Desafortunadamente, el distinct()
El método no tiene tal sobrecarga. Sin modificar la verificación de igualdad dentro del Person
clase es posible hacer esto de manera sucinta?

que tal
Una alternativa sería ubicar a las personas en un mapa usando el nombre como clave:
persons.collect(Collectors.toMap(Person::getName, p -> p, (p, q) -> p)).values();
Tenga en cuenta que la Persona que se mantiene, en caso de un nombre duplicado, será la primera que se encuentre.

Santhosh
Otra solución, usando Set
. Puede que no sea la solución ideal, pero funciona
Set<String> set = new HashSet<>(persons.size());
persons.stream().filter(p -> set.add(p.getName())).collect(Collectors.toList());
O si puede modificar la lista original, puede usar eliminar si método
persons.removeIf(p -> !set.add(p.getName()));

bromista
Hay un enfoque más simple usando un TreeSet con un comparador personalizado.
persons.stream()
.collect(Collectors.toCollection(
() -> new TreeSet<Person>((p1, p2) -> p1.getName().compareTo(p2.getName()))
));
También podemos usar RxJava (muy poderoso extensión reactiva Biblioteca)
Observable.from(persons).distinct(Person::getName)
o
Observable.from(persons).distinct(p -> p.getName())