Java8 Streams - 使用 Stream Distinct 删除重复项
Java8 Streams - Remove Duplicates With Stream Distinct
我有一个流,例如:
Arrays.stream(new String[]{"matt", "jason", "michael"});
我想删除以相同字母开头的名字,这样就只剩下一个以该字母开头的名字(无论哪个)。
我正在尝试了解 distinct()
方法的工作原理。我在文档中读到它基于对象的 "equals" 方法。但是,当我尝试包装字符串时,我注意到从未调用过 equals 方法,也没有删除任何内容。我在这里遗漏了什么吗?
包装器 Class:
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);
}
每当重写equals
时,还需要重写hashCode()
方法,在distinct()
的实现中会用到。
在这种情况下,您可以使用
@Override public int hashCode() {
return test.charAt(0);
}
...这样就可以了。
替代方法
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);
我有一个流,例如:
Arrays.stream(new String[]{"matt", "jason", "michael"});
我想删除以相同字母开头的名字,这样就只剩下一个以该字母开头的名字(无论哪个)。
我正在尝试了解 distinct()
方法的工作原理。我在文档中读到它基于对象的 "equals" 方法。但是,当我尝试包装字符串时,我注意到从未调用过 equals 方法,也没有删除任何内容。我在这里遗漏了什么吗?
包装器 Class:
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);
}
每当重写equals
时,还需要重写hashCode()
方法,在distinct()
的实现中会用到。
在这种情况下,您可以使用
@Override public int hashCode() {
return test.charAt(0);
}
...这样就可以了。
替代方法
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);