广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java Stream比较两个List的差异,并取出不同的对象
  • 547
分享到

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

javalist 2023-09-02 09:09:44 547人浏览 薄情痞子
摘要

可以使用Java8的Stream api来比较两个List的差异,并取出不同的对象。 方式一具体步骤如下:   1. 将两个List转换为Stream类型;   2. 调用Stream的filter方法,将不同的对象过滤出来;  

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

方式一具体步骤如下:

  1. 将两个List转换为Stream类型;

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

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

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

方式二具体步骤如下: 

List list1 = Arrays.asList("apple", "banana", "orange", "pear");List list2 = Arrays.asList("apple", "banana", "grape");List 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类型的变量list1和list2,分别表示要比较的两个列表。然后使用Stream的concat()方法将两个Stream对象连接起来,得到一个由两个列表的不同元素组成的Stream。

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

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

方式三具体步骤如下: 

List l1 = new ArrayList<>();l1.add(new Object(1, "a"));l1.add(new Object(2, "b"));l1.add(new Object(3, "c"));List l2 = new ArrayList<>();l2.add(new Object(1, "a"));l2.add(new Object(3, "c"));l2.add(new Object(4, "d"));List 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 l1 = Arrays.asList(        new ProductAttributeNameDTO(1L, "颜色"),        new ProductAttributeNameDTO(2L, "尺码"),        new ProductAttributeNameDTO(3L, "重量"));List l2 = Arrays.asList(        new ProductAttributeNameDTO(1L, "颜色"),        new ProductAttributeNameDTO(3L, "重量"),        new ProductAttributeNameDTO(4L, "材质"));List 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进行比较。

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

--结束END--

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

本文链接: https://www.lsjlt.com/news/390474.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作