without values una repetidos remove property lista from eliminar elementos java string java-8 java-stream

values - java stream distinct by property



Java8 Streams-Eliminar duplicados con Stream Distinct (2)

Cada vez que anule equals , también deberá anular el método hashCode() , que se usará en la implementación de distinct() .

En este caso, podrías usar

@Override public int hashCode() { return test.charAt(0); }

... lo que funcionaría bien

Tengo una corriente como:

Arrays.stream(new String[]{"matt", "jason", "michael"});

Me gustaría eliminar los nombres que comienzan con la misma letra para que solo quede un nombre (no importa cuál) que comience con esa letra.

Estoy tratando de entender cómo funciona el método distinct() . Leí en la documentación que se basa en el método "igual" de un objeto. Sin embargo, cuando trato de envolver la cadena, me doy cuenta de que nunca se llama al método equals y que no se elimina nada. ¿Hay algo que me estoy perdiendo aquí?

Clase de envoltura:

static class Wrp { String test; Wrp(String s){ this.test = s; } @Override public boolean equals(Object other){ return this.test.charAt(0) == ((Wrp) other).test.charAt(0); } }

Y un código simple:

public static void main(String[] args) { Arrays.stream(new String[]{"matt", "jason", "michael"}) .map(Wrp::new) .distinct() .map(wrp -> wrp.test) .forEach(System.out::println); }


Enfoque alternativo

String[] array = {"matt", "jason", "michael"}; Arrays.stream(array) .map(name-> name.charAt(0)) .distinct() .map(ch -> Arrays.stream(array).filter(name->name.charAt(0) == ch).findAny().get()) .forEach(System.out::println);