【发布时间】:2015-01-12 21:55:35
【问题描述】:
我有一个流,例如:
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);
}
【问题讨论】:
-
这是我在this answer 中描述的技术。 (滚动到答案的末尾)。这会让你做
filter(distinctByKey(s -> s.charAt(0)))。 -
旁注:对于文字流,使用
Stream.of("matt", "jason", "michael")通常更容易。
标签: java string java-8 java-stream