Redian新闻
>
Java Stream 比较两个 List 的差异,并取出不同的对象

Java Stream 比较两个 List 的差异,并取出不同的对象

公众号新闻

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn

来源:blog.csdn.net/Ascend1977
/article/details/130131304


可以使用Java8的Stream API来比较两个List的差异,并取出不同的对象。

方式一具体步骤如下:

  1. 将两个List转换为Stream类型;
  2. 调用Stream的filter方法,将不同的对象过滤出来;
  3. 将过滤出的不同的对象转换为List类型。
List<String> list1 = Arrays.asList("A""B""C""D");
List<String> list2 = Arrays.asList("B""C""E""F""A""D");
List<String> diff = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
List<String> diff1 = list2.stream().filter(item -> !list1.contains(item)).collect(Collectors.toList());
diff.addAll(diff1);

diff.forEach(x -> System.out.println(x));

上述代码中,将两个List类型的对象list1和list2转换为Stream类型,并调用filter方法筛选出不同的对象。最后通过collect方法将不同的对象转换为List类型,并输出结果。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

方式二具体步骤如下:

List<String> list1 = Arrays.asList("apple""banana""orange""pear");
List<String> list2 = Arrays.asList("apple""banana""grape");
 
List<String> list3 = Stream.concat(
        list1.stream().filter(str -> !list2.contains(str)),
        list2.stream().filter(str -> !list1.contains(str)))
        .collect(Collectors.toList());
 
System.out.println("Different strings: " + list3);

上述代码,首先定义了两个List<String>类型的变量list1和list2,分别表示要比较的两个列表。然后使用Stream的concat()方法将两个Stream对象连接起来,得到一个由两个列表的不同元素组成的Stream。

具体来说,第一个Stream对象是list1中与list2不同的元素,使用filter()方法过滤出来;第二个Stream对象是list2中与list1不同的元素,同样也是使用filter()方法过滤出来。最后使用collect(Collectors.toList())将这些不同的元素收集到一个List中,返回的就是两个列表不同的元素组成的集合list3。

最后在控制台输出集合list3,即可得到list1和list2中不同的字符串。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

方式三具体步骤如下:

List<Object> l1 = new ArrayList<>();
l1.add(new Object(1"a"));
l1.add(new Object(2"b"));
l1.add(new Object(3"c"));
 
List<Object> l2 = new ArrayList<>();
l2.add(new Object(1"a"));
l2.add(new Object(3"c"));
l2.add(new Object(4"d"));
 
List<Object> resultList = Stream.concat(l1.stream(), l2.stream())
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
        .entrySet().stream()
        .filter(e -> e.getValue() == 1)
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());

首先将两个List通过Stream.concat方法合并成一个新的Stream对象,并使用Collectors.groupingBy方法来按照对象值进行分组计数。然后通过过滤出现次数为1的对象,即为两个List中不同的对象。最后用Collectors.toList方法将所有不同的对象放到一个新的List中。

需要注意的是,Object类需要正确实现equals和hashCode方法,以便Stream能够正确进行对象的比较。同时,此方法适用于List中存放的对象是Java内置类型或者自定义类型,但不适用于包含数组、Map等集合类型的情况。

方式四具体步骤如下:

根据对象的属性进行比较两个拥有相同对象List的集合,并取出不同对象。

List<ProductAttributeNameDTO> l1 = Arrays.asList(
        new ProductAttributeNameDTO(1L"颜色"),
        new ProductAttributeNameDTO(2L"尺码"),
        new ProductAttributeNameDTO(3L"重量")
);
List<ProductAttributeNameDTO> l2 = Arrays.asList(
        new ProductAttributeNameDTO(1L"颜色"),
        new ProductAttributeNameDTO(3L"重量"),
        new ProductAttributeNameDTO(4L"材质")
);
 
List<ProductAttributeNameDTO> resultList = Stream.concat(l1.stream(), l2.stream())
        .collect(Collectors.groupingBy(ProductAttributeNameDTO::getName, Collectors.counting()))
        .entrySet().stream()
        .filter(e -> e.getValue() == 1)
        .map(e -> e.getKey())
        .map(name -> Stream.concat(l1.stream(), l2.stream()).filter(p -> p.getName().equals(name)).findFirst().get())
        .collect(Collectors.toList());

首先将两个List通过Stream.concat方法合并成一个新的Stream对象,并使用Collectors.groupingBy方法来按照属性名称进行分组计数。然后通过过滤出现次数为1的属性名称,即为两个List中不同的属性名称。最后使用Stream.map方法获取对应名称的第一个ProductAttributeNameDTO对象,放到一个新的List中。

需要注意的是,ProductAttributeNameDTO类需要正确实现equals和hashCode方法,以便Stream能够正确进行对象的比较。同时,此方法适用于List中存放的是ProductAttributeNameDTO类型的对象。如果存放其他类型的对象,则需要根据对象的属性进行比较或自定义Comparator进行比较。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
Science|首次构建出衰老果蝇细胞图谱,揭示身体中不同类型的细胞以不同的速度衰老五十八 外流狂野|每十年一次公路旅行!在不同的年纪,看不同的风景…清除速度比写文快多了【直播预告·港大ICB家族办公室中心】国内外家族办公室的差异与共融离苦之前切莫疏忽大意 | 九、不同的心需要不同的修行台积电官宣入股Arm,并取下EUV技术关键设备商股权五十七 高考唯品会股价跌8%:Q2营收较两年前掉17亿 电商行业份额下滑周润发上海和香港街头晨跑画面引热议,两种不同的待遇,两种不同的人生汽车寿命差异,不是一般的大不同降压药物疗效存在巨大的个体差异,个性化降压方案或可能实现直播预告 | 探秘皮尔法伯集团在制药领域的差异化竞争之路你好,我是筚(bì)篥( lì)!独家专访 | 莱克电气董事长倪祖根:不同的地域环境背景下,商帮的从商理念也会有所不同Scuba Oversized Java: 全拉链带帽 vs 半拉链立领考研 or 留学?对比「中美研究生」的差异,这6点值得注意!澳洲超市价格竟高出国外3倍!海外澳人愤怒揭露价格差异,斥Woolies和Coles“贪婪”,大量网友附和台湾走走(四):走进阿里山周润发上海和香港街头晨跑画面流出,两种不同的待遇,两种不同的人生…[打卡] 新加坡、香港在经济表现上的差异有一个非常“抠门”的对象,你该怎么办?【𝐂𝐚𝐥𝐧𝐢𝐊𝐞𝐚𝐧双皮奶无痕内裤】49元三条!巨巨巨好穿 !!简直就是辣妹顶配,食品级冰箱收纳盒【一日团】思维模式的差异《终身成长》Extreme Drinking Claims Another Chinese Livestreamer白莲花编剧背后的故事被冤枉盗窃后,两个孩子截然不同的行为,暴露了教育的参差鼻炎、感冒还是过敏?如何区分它们之间的差异?Biological Psychiatry | 浙江大学李晓明团队揭示大脑不同的应对策略Nature|新方法一次性可以对动物体内的每个细胞进行不同的基因修饰美国资本是我们可以合作的对象!#英语学习#Restrain, Refrain, and Restrict有什么区别?看看你能答对这道题吗?Nature:新研究揭示两个不同的大脑区域让母鼠照顾或杀死幼崽𝐂𝐚𝐥𝐧𝐢𝐊𝐞𝐚𝐧双皮奶内衣裤,软弹有度,上身0束缚~Troubled Singing Reality Show Accused of Mistreating Coco Lee深度复盘巴菲特、芒格对比亚迪的投资,兼论比亚迪与特斯拉的差异
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。