una - java list without duplicates



Java8 Streams-Eliminar duplicados con Stream Distinct (2)

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);
}

Answer #1

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


Answer #2

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);




java-stream