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