当前位置: 首页 > 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.dtcms.com/a/150233.html

相关文章:

  • Redis 详解:安装、数据类型、事务、配置、持久化、订阅/发布、主从复制、哨兵机制、缓存
  • 实现SpringBoot底层机制【Tomcat启动分析+Spring容器初始化+Tomcat 如何关联 Spring容器】
  • 【C++】13.list的模拟实现
  • docker部署seafile修改默认端口并安装配置onlyoffice实现在线编辑
  • 硬核解析:整车行驶阻力系数插值计算与滑行阻力分解方法论
  • 2025-04-23 Python深度学习3——Tensor
  • Transformer:引领深度学习新时代的架构
  • C# 使用Windows API实现键盘钩子的类
  • 【KWDB 创作者计划】_嵌入式硬件篇---数字电子器件
  • Android Cordova 开发 - Cordova 解读初始化项目(index.html meta、Cordova.js、config.xml)
  • AndroidAutomotive模块介绍(四)VehicleHal介绍
  • Pytorch图像数据转为Tensor张量
  • 大厂面试:MySQL篇
  • create_function()漏洞利用
  • centos stream 10 修改 metric
  • LSTM-GAN生成数据技术
  • 4. 继承基类实现浏览器_Chrome
  • 6.1.多级缓存架构
  • 【Axure高保真原型】动态折线图
  • MongoDB Ubuntu 安装
  • 智能文档解析系统架构师角色定义
  • 智驭未来:NVIDIA自动驾驶安全白皮书与实验室创新实践深度解析
  • Axure按钮设计分享:打造高效交互体验的六大按钮类型
  • Anomize: Better Open Vocabulary Video Anomaly Detection
  • 3.第三章:数据治理的战略价值
  • 初识Redis · 持久化
  • 配置 Nginx 的 HTTPS
  • 分布式理论和事务
  • Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)
  • 从Nacos derby RCE学习derby数据库的利用