0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么使用Java8的Stream API比较两个List的差异呢?

jf_ro2CN3Fa 来源:CSDN 2023-08-12 11:15 次阅读

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

方式一具体步骤如下:

将两个List转换为Stream类型;

调用Stream的filter方法,将不同的对象过滤出来;

将过滤出的不同的对象转换为List类型。

Listlist1=Arrays.asList("A","B","C","D");
Listlist2=Arrays.asList("B","C","E","F","A","D");
Listdiff=list1.stream().filter(item->!list2.contains(item)).collect(Collectors.toList());
Listdiff1=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类型,并输出结果。

方式二具体步骤如下:

Listlist1=Arrays.asList("apple","banana","orange","pear");
Listlist2=Arrays.asList("apple","banana","grape");

Listlist3=Stream.concat(
list1.stream().filter(str->!list2.contains(str)),
list2.stream().filter(str->!list1.contains(str)))
.collect(Collectors.toList());

System.out.println("Differentstrings:"+list3);

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

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

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

方式三具体步骤如下:

Listl1=newArrayList<>();
l1.add(newObject(1,"a"));
l1.add(newObject(2,"b"));
l1.add(newObject(3,"c"));

Listl2=newArrayList<>();
l2.add(newObject(1,"a"));
l2.add(newObject(3,"c"));
l2.add(newObject(4,"d"));

ListresultList=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的集合,并取出不同对象。

Listl1=Arrays.asList(
newProductAttributeNameDTO(1L,"颜色"),
newProductAttributeNameDTO(2L,"尺码"),
newProductAttributeNameDTO(3L,"重量")
);
Listl2=Arrays.asList(
newProductAttributeNameDTO(1L,"颜色"),
newProductAttributeNameDTO(3L,"重量"),
newProductAttributeNameDTO(4L,"材质")
);

ListresultList=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进行比较。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15235

    浏览量

    171212
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    19944
  • 过滤器
    +关注

    关注

    1

    文章

    407

    浏览量

    18998

原文标题:Java Stream 比较两个 List 的差异,并取出不同的对象

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Stream API原理介绍

    Stream APIJava 8 中最重要的新特性之一,它是处理集合和数组的一种新方式。它提供了一种简单、灵活和可读的方式来处理集合和数组中的元素,从而使代码更加简洁、高效和易于维护。 1.
    的头像 发表于 09-30 15:31 355次阅读

    TestStand中如何快速比较两个类似的Sequence之间的差异

    TestStand提供了很多比较丰富的工具,其中TestStand File Diff and Merge Utility就是专门用来比较两个Sequence测试序列差异的工具,该工具
    发表于 08-24 21:05

    JAVA学习直通车(教程+书籍+100实例+问题与解答)

    对于Java8的并行流并不陌生,没错,我们常常用它来执行并行任务,但是由于并行流(parallel stream)采用的是享线程池,可能会对我们的性能造成严重影响,那怎么处理?`
    发表于 10-25 14:35

    请问两个API的使用是什么?

    你好两个API的使用是什么?StRelaMARMASK()RTCHGETALMALMASK()实际上,我正在尝试比较当前时间和警报时间。如果报警时间和当前时间匹配,则会发生报警。如果两个
    发表于 09-18 13:52

    api中如何挂载两个分区

    想使用dfs挂载elm文件系统,flash已经分好了两个区,但是在api中没有看到如何挂载两个分区,现在只能挂载一分区。
    发表于 09-15 14:25

    java8新特性

    java8为接口声明添加非抽象方法的实现,也成为拓展方法。
    发表于 11-27 15:54 1620次阅读

    一探究竟Java 8的Stream API性能

    已经对 Stream API 的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?
    的头像 发表于 05-04 14:20 1528次阅读
    一探究竟<b class='flag-5'>Java</b> 8的<b class='flag-5'>Stream</b> <b class='flag-5'>API</b>性能

    如何利用Stream API来优化Java代码

    使用Stream API优化代码 Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大
    的头像 发表于 07-26 14:30 1141次阅读

    JAVA8提供了Optional类来优化这种写法

    这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明
    的头像 发表于 04-24 15:18 853次阅读

    Linux中如何比较两个文件的差异

    Linux 中如何比较两个文件的差异?答案是使用 diff 命令。
    的头像 发表于 01-17 17:30 4636次阅读
    Linux中如何<b class='flag-5'>比较</b><b class='flag-5'>两个</b>文件的<b class='flag-5'>差异</b>?

    Linux中如何比较两个文件的差异

    Linux 中如何比较两个文件的差异?答案是使用 diff 命令。
    的头像 发表于 01-30 16:04 1.1w次阅读
    Linux中如何<b class='flag-5'>比较</b><b class='flag-5'>两个</b>文件的<b class='flag-5'>差异</b>?

    list.sort()排序比stream().sorted()排序性能更好吗?

    看到一个评论,里面提到了list.sort()和list.strem().sorted()排序的差异
    的头像 发表于 08-09 10:27 578次阅读
    <b class='flag-5'>list</b>.sort()排序比<b class='flag-5'>stream</b>().sorted()排序性能更好吗?

    Java8Stream流 map() 方法

    前言 在日常的开发工作中经常碰到要处理 List 中数据的问题,比如从一个对象集合中获得对象中的一个属性的集合。之前我们想到的是遍历每个元素,然后取出来放到另外一个集合中,比较繁琐;在 Java8
    的头像 发表于 09-25 11:06 719次阅读
    <b class='flag-5'>Java8</b>的<b class='flag-5'>Stream</b>流 map() 方法

    Java8的新特性

    虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特性也被大家广
    的头像 发表于 10-10 17:12 307次阅读

    JavaStream的常用知识

    ?我们都知道,传统的处理中,每一步我们都需要通过循环控制,逻辑控制,解包,重新装箱这些工作。 非生产线示意处理图 这些步骤让我们的程序的业务逻辑支离破碎,经常处理数据类的小伙伴尤为痛苦。幸运的是,Java8为我们引入了Stream,使用
    的头像 发表于 10-11 15:45 256次阅读
    <b class='flag-5'>Java</b>的<b class='flag-5'>Stream</b>的常用知识