Java8 Streams-Supprimer Les Doublons Avec Stream Distinct

j'ai un flux de tels que:

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

j'aimerais supprimer les noms qui commencent par la même lettre pour qu'il ne reste qu'un nom (peu importe lequel) qui commence par cette lettre.

j'essaie de comprendre comment le distinct() la méthode fonctionne. J'ai lu dans la documentation que c'est basé sur la méthode "égal" d'un objet. Cependant, quand j'essaye d'envelopper la chaîne, je remarque que la méthode equal n'est jamais appelée et que rien n'est enlevé. Être il y a quelque chose que je manque ici?

Classe D'Emballage:

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

Et un code 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);
}
17
demandé sur dimo414 2015-01-13 00:55:35

2 réponses

Chaque fois que vous remplacez equals, vous devez également remplacer les distinct().

Dans ce cas, vous pouvez simplement utiliser

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

...ce qui marcherait très bien.

17
répondu Louis Wasserman 2015-01-12 21:59:15

approche Alternative

    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);
8
répondu Sujit Kamthe 2017-03-06 12:41:58