У меня есть поток, такой как:Java8 Streams - Удаление дубликатов с потоком Distinct
Arrays.stream(new String[]{"matt", "jason", "michael"});
Я хотел бы, чтобы удалить имена, которые начинаются с той же буквы, так что только одно имя (не имеет значения, какой) начинает с этой буквой осталось.
Я пытаюсь понять, как работает метод distinct()
. Я прочитал в документации, что он основан на методе «равно» объекта. Однако, когда я пытаюсь обернуть String, я замечаю, что метод equals никогда не вызывается и ничего не удаляется. Здесь что-то не хватает?
Упаковочный Класс:
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);
}
}
И некоторые простой код:
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);
}
Там в метод, который я описал в [этот ответ] (http://stackoverflow.com/a/27872086/1441122). (Прокрутите до конца ответа). Это позволит вам выполнить фильтрацию (distinctByKey (s -> s.charAt (0))). –
Замечание: для потока литералов часто проще использовать 'Stream.of (« матовый »,« jason »,« michael »)'. –