当前位置: 首页 > news >正文

Stream API 对两个 List 进行去重操作

        在 Java 8 及以上版本中,可以使用 Lambda 表达式和 Stream API 对两个 List 进行去重操作。以下是几种常见的去重场景及对应的 Lambda 表达式实现方式:

1. 合并两个 List 并去重

List<String> list1 = Arrays.asList("A", "B", "C");
List<String> list2 = Arrays.asList("B", "C", "D");// 合并并去重(使用 Stream.concat + distinct)
List<String> distinctList = Stream.concat(list1.stream(), list2.stream()).distinct().collect(Collectors.toList());System.out.println(distinctList); // [A, B, C, D]

2. 取两个 List 的交集(保留重复元素)

List<String> list1 = Arrays.asList("A", "B", "B", "C");
List<String> list2 = Arrays.asList("B", "C", "C", "D");// 取交集(保留重复元素)
List<String> intersection = list1.stream().filter(list2::contains).collect(Collectors.toList());System.out.println(intersection); // [B, B, C]

3. 取两个 List 的交集(去重)

List<String> list1 = Arrays.asList("A", "B", "B", "C");
List<String> list2 = Arrays.asList("B", "C", "C", "D");// 取交集(去重)
List<String> distinctIntersection = list1.stream().filter(list2::contains).distinct().collect(Collectors.toList());System.out.println(distinctIntersection); // [B, C]

4. 取两个 List 的差集(list1 有但 list2 没有)

List<String> list1 = Arrays.asList("A", "B", "C");
List<String> list2 = Arrays.asList("B", "C", "D");// list1 有但 list2 没有的元素(去重)
List<String> difference = list1.stream().filter(e -> !list2.contains(e)).collect(Collectors.toList());System.out.println(difference); // [A]

5. 合并两个 List 并去重(自定义对象去重)

        如果 List 里存放的是自定义对象(如 User),需要重写 equals() 和 hashCode() 方法,然后使用 distinct() 去重:

class User {private String name;private int age;// 构造方法、getter、setter 省略@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return age == user.age && Objects.equals(name, user.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}// 测试
List<User> list1 = Arrays.asList(new User("Alice", 20), new User("Bob", 25));
List<User> list2 = Arrays.asList(new User("Bob", 25), new User("Charlie", 30));List<User> distinctUsers = Stream.concat(list1.stream(), list2.stream()).distinct().collect(Collectors.toList());distinctUsers.forEach(u -> System.out.println(u.getName())); // Alice, Bob, Charlie

6. 使用 Set 去重(更高效)

如果只是单纯去重,可以先把 List 转成 Set(自动去重),再转回 List

List<String> list = Arrays.asList("A", "B", "B", "C");
List<String> distinctList = new ArrayList<>(new HashSet<>(list));System.out.println(distinctList); // [A, B, C](顺序可能变化)

7、总结

场景方法
合并两个 List 并去重Stream.concat(list1.stream(), list2.stream()).distinct()
取交集(保留重复)list1.stream().filter(list2::contains).collect(Collectors.toList())
取交集(去重)list1.stream().filter(list2::contains).distinct().collect(Collectors.toList())
取差集(list1 有但 list2 没有)list1.stream().filter(e -> !list2.contains(e)).collect(Collectors.toList())
自定义对象去重重写 equals() 和 hashCode(),再用 distinct()

选择合适的方式取决于你的具体需求(是否保留顺序、是否需要高性能等)。

http://www.xdnf.cn/news/95545.html

相关文章:

  • python实战项目63:获取腾讯招聘信息内容并进行统计分析
  • 9N60-ASEMI无人机专用功率器件9N60
  • Java进阶--注解与克隆
  • IDEA add gitlab account 提示
  • render props是什么?
  • 【MQ篇】RabbitMQ之发布订阅模式!
  • Hive中Map和Reduce阶段的分工
  • MySQL通用性能优化模板(MySQL General Performance Optimization Template)
  • MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?
  • 爱普生SG-8200CG可编程晶振成为工业自动化领域的理想选择
  • Tailwind CSS 实战:基于 Kooboo 构建个人博客页面
  • vue3中slot(插槽)的详细使用
  • JVM 生产环境问题定位与解决实战(七):实战篇——OSSClient泄漏引发的FullGC风暴
  • 事业单位体检心电图不合格类型有哪些
  • 视频监控从安装到优化的技术指南,视频汇聚系统EasyCVR智能安防系统构建之道
  • 如何使用 uv 构建 Python 包并本地安装
  • 配色之道:解码产品设计中的UI设计配色艺术
  • 卷积神经网络:视觉炼金术士的数学魔法
  • SQL进阶知识:四、索引优化
  • C# 使用Windows API实现键盘钩子的类
  • Java虚拟机面试题:JVM调优
  • 网页布局新视角:全局居中的魅力与应用
  • Jsoup、Selenium 和 Playwright 的含义、作用和区别
  • SpringBoot整合SSE,基于okhttp
  • Java面试:探索Spring Boot与微服务的深度挑战
  • 01 ubuntu中wps桌面快捷键无法使用
  • C++23 新特性:令声明顺序决定非静态类数据成员的布局 (P1847R4)
  • C++学习:六个月从基础到就业——STL算法(一) 基础与查找算法
  • JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for WebGL进行叠加显示
  • C++语言速成,语法及示例宝典汇总整理