【问题标题】:How to find the difference between two String ArrayList using java 8 Streams? [duplicate]java - 如何使用java 8 Streams找到两个String ArrayList之间的区别? [复制]
【发布时间】:2018-06-09 07:48:01
【问题描述】:

我需要使用 java 8 features 找到两个字符串数组列表之间的区别。 目前我正在这样做

final List<String> a = new ArrayList<>();
        a.add("1");
        a.add("2");
        a.add("3");

        final List<String> b = new ArrayList<>();
        b.add("1");
        b.add("2");
        b.add("4");

        final List<String> result = a.stream().filter((s) -> b.stream().noneMatch(s::equals))
                .collect(Collectors.toList());
        final List<String> result2 = b.stream().filter((s) -> a.stream().noneMatch(s::equals))
                .collect(Collectors.toList());

        System.out.println(result);
        System.out.println(result2);

        final List<String> FinalResult = java.util.stream.Stream.concat(result.stream(), result2.stream())
                .distinct()
                .collect(Collectors.toList());   

        System.out.println(FinalResult);

任何人都可以为同一件事提出更简洁和更短的代码吗?我觉得它可以通过其他更简单的方式来完成。

【问题讨论】:

  • 集合中的元素是否允许重复?
  • 你可以做类似Stream.concat(a.stream(), b.stream()).filter(s -&gt; a.contains(s) != b.contains(s)).collect(Collectors.toList());
  • @TalOhana 谢谢你的帮助
  • @TalOhana 是否要求 m 将过滤器内的 a 和 b 设为 final 。为什么需要它?我不愿意让它成为最终的

标签: java arrays arraylist collections java-8


【解决方案1】:

你可以用下面的代码做同样的事情:

List<String> result = b.stream()
                       .filter(not(new HashSet<>(a)::contains))
                       .collect(Collectors.toList());

private static <T> Predicate<T> not(Predicate<T> predicate) {
    return predicate.negate();
}

希望对你有帮助。

【讨论】:

  • 这太棒了!谢谢
  • 您上面的代码只给出了列表 b 中的元素并且不在 A 中,即 B-A 。但我需要 A-B + B-A 元素
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2015-09-06
相关资源
最近更新 更多