使用Java 8中的lambda函数删除重复项

时间:2018-02-03 14:43:49

标签: java lambda

无论是什么情况,我都需要从String的ArrayList中删除重复项。对于eq:

List list = Lists.newArrayList("Luke","luke");// it's guava's method
list.stream().distinct();
上面的

distinct()不会做任何帮助,因为它适用于将返回false的equals方法。有没有其他方法可以做类似的事情:

list.stream().distinct((a,b)->a.equalsIgnoreCase(b)).collect(..);

更新: 它可能与possible duplicate不同,因为可能重复的答案会显示如何使用地图将distinct()与属性结合使用。但是一张包含" Luke"如果添加" luke"将不会返回true因此,这些答案对这个问题不起作用。

2 个答案:

答案 0 :(得分:0)

这是一种方法。我假设重复项不需要彼此相邻,所以我不得不使用HashSet来保持O(n)。此外,还必须就案件达成一致(小写)。

public static void main(String[] args) {
    List<String> list = Arrays.asList("Luke", "tony", "Tony", "luke");
    Set<String> set = new HashSet<>();
    list.stream().map(s -> s.toLowerCase()).filter(s -> !set.contains(s)).forEach(set::add);
    System.out.println(set);
}

答案 1 :(得分:0)

以下是使用本地课程的可能性:

public List<String> yourFunction(List<String> list) {
    class IgnoringCase {
        String wrapped;
        public IgnoringCase(String w) { wrapped = w; }
        public boolean equals(Object o) {
            if (o instanceof IgnoringCase) {
                IgnoringCase other = (IgnoringCase) o;
                return wrapped.equalsIgnoreCase(other.wrapped);
            } return false;
        }
    }
    return list.stream()
        .map(IgnoringCase::new) // enable alternative equals
        .distinct()
        .map(i -> i.wrapped) // map back to String
        .collect(toList());
}

显然,没有必要将本地化为本地,如果你更喜欢它,你可以使用静态嵌套或顶级类。