java中用lambda求集合差集需用stream.filter()配合set.contains(),a−b即a中不在b的元素;对象集合须重写equals/hashcode;双向差集需分别计算,结果保持原序。

Java 中用 Lambda 表达式处理集合差集,核心是借助 Stream 的 filter() 方法配合 contains() 判断,不修改原集合,代码简洁且语义清晰。
差集的基本逻辑
差集 A − B 指“属于 A 但不属于 B”的元素。Lambda 实现的关键在于:对 A 中每个元素,检查它是否 不在 B 中。
A.stream().filter(a -> !B.contains(a)).collect(Collectors.toList())- 注意:这里 B 建议转为
Set(如new HashSet(B)),否则contains()在大列表中会退化为 O(n) 查找,整体性能变 O(n²)
高效写法:用 Set 提升查询效率
避免反复遍历列表,推荐先将对比集合转为 Set:
List<string> list1 = Arrays.asList("a", "b", "c");
List<string> list2 = Arrays.asList("b", "c", "d");
Set<string> set2 = new HashSet(list2);
List<string> diff = list1.stream()
.filter(item -> !set2.contains(item))
.collect(Collectors.toList()); // 结果:["a"]
</string></string></string></string>
对象集合的差集(需注意 equals/hashCode)
若集合元素是自定义对象(如 User),必须正确重写 equals() 和 hashCode(),否则 set2.contains(item) 无法按业务逻辑判断相等。
- 例如按 id 判断是否相同,就要在
equals中比较 id 字段 - 未重写时,默认使用引用比较,两个内容相同的对象也会被视为不同
双向差集与结果顺序
差集不是对称操作,A−B 和 B−A 不同,常需分别计算:
-
list1 − list2:list1.stream().filter(x -> !set2.contains(x)).collect(...) -
list2 − list1:list2.stream().filter(x -> !set1.contains(x)).collect(...) - 结果顺序默认保持原集合的迭代顺序(如
ArrayList的插入序)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











