【问题标题】:Remove duplicates using lambda function in Java 8 [duplicate]在 Java 8 中使用 lambda 函数删除重复项 [重复]
【发布时间】:2018-02-03 14:43:49
【问题描述】:

无论情况如何,我都需要从 String 的 ArrayList 中删除重复项。对于当量:

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,因此这些答案不适用于此问题。

【问题讨论】:

  • 出于好奇,Java-8 中是否有静态方法Lists.newArrayList
  • @zlakad 不,那是番石榴方法。
  • @JoeC,谢谢,我很困惑。
  • 我还是不明白这是怎么重复的。

标签: java lambda


【解决方案1】:

这是一种方法。我假设重复的项目不需要彼此相邻,所以我必须使用 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);
}

【讨论】:

    【解决方案2】:

    这是使用本地类的一种可能性:

    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());
    }
    

    显然,无需将类设为本地类,如果您更喜欢静态嵌套类或顶级类,则可以使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2015-11-07
      • 2021-04-07
      • 2014-04-16
      • 2023-03-20
      相关资源
      最近更新 更多