我有一个例如:
的流Arrays.stream(new String[]{"matt", "jason", "michael"});
我想删除以相同字母开头的名称,以便只留下以该字母开头的一个名称(并不重要)。
我试图了解distinct()
方法的工作原理。我在文档中读到它基于" equals"对象的方法。但是,当我尝试包装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);
}
答案 0 :(得分:19)
每当您覆盖equals
时,您还需要覆盖hashCode()
方法,该方法将用于distinct()
的实施。
在这种情况下,您可以使用
@Override public int hashCode() {
return test.charAt(0);
}
......哪种方法可以正常使用。
答案 1 :(得分:16)
替代方法
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);