Java8 Streams - 删除具有Stream Distinct的重复项

时间:2015-01-12 21:55:35

标签: java string java-8 java-stream

我有一个例如:

的流
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);
}

2 个答案:

答案 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);