java中如何计算两个list的差集,并集,交集等,举一个详细的实例说明,用stream流的filter,contains等去实现。

在Java中,可以使用Java 8引入的Stream API来优雅地计算两个列表的交集、并集和差集。下面是使用Stream流的filtercontains等方法来实现这些集合运算的一个详细示例。

示例类定义

首先,我们定义一个简单的Person类来作为我们的数据模型:

复制代码

java

深色版本

复制代码
1import java.util.Objects;
2
3public class Person {
4    private String name;
5    private int age;
6
7    public Person(String name, int age) {
8        this.name = name;
9        this.age = age;
10    }
11
12    public String getName() {
13        return name;
14    }
15
16    public int getAge() {
17        return age;
18    }
19
20    @Override
21    public boolean equals(Object o) {
22        if (this == o) return true;
23        if (!(o instanceof Person)) return false;
24        Person person = (Person) o;
25        return getAge() == person.getAge() &&
26               getName().equals(person.getName());
27    }
28
29    @Override
30    public int hashCode() {
31        return Objects.hash(getName(), getAge());
32    }
33
34    @Override
35    public String toString() {
36        return "Person{" +
37               "name='" + name + '\'' +
38               ", age=" + age +
39               '}';
40    }
41}

计算交集、并集和差集

接下来,我们将定义一个方法来计算两个List<Person>的交集、并集和差集:

复制代码

java

深色版本

复制代码
1import java.util.Arrays;
2import java.util.List;
3import java.util.Set;
4import java.util.stream.Collectors;
5
6public class CollectionOperations {
7
8    public static void main(String[] args) {
9        List<Person> list1 = Arrays.asList(
10                new Person("Alice", 25),
11                new Person("Bob", 30),
12                new Person("Charlie", 35),
13                new Person("David", 40)
14        );
15
16        List<Person> list2 = Arrays.asList(
17                new Person("Bob", 30),
18                new Person("Charlie", 35),
19                new Person("Eve", 45),
20                new Person("Frank", 50)
21        );
22
23        // 计算交集
24        List<Person> intersection = computeIntersection(list1, list2);
25        System.out.println("交集: " + intersection);
26
27        // 计算并集
28        List<Person> union = computeUnion(list1, list2);
29        System.out.println("并集: " + union);
30
31        // 计算差集 (list1 - list2)
32        List<Person> difference1 = computeDifference(list1, list2);
33        System.out.println("差集 (list1 - list2): " + difference1);
34
35        // 计算差集 (list2 - list1)
36        List<Person> difference2 = computeDifference(list2, list1);
37        System.out.println("差集 (list2 - list1): " + difference2);
38    }
39
40    public static List<Person> computeIntersection(List<Person> list1, List<Person> list2) {
41        Set<Person> set2 = list2.stream().collect(Collectors.toSet());
42        return list1.stream()
43                   .filter(set2::contains)
44                   .collect(Collectors.toList());
45    }
46
47    public static List<Person> computeUnion(List<Person> list1, List<Person> list2) {
48        Set<Person> set1 = list1.stream().collect(Collectors.toSet());
49        set1.addAll(list2);
50        return set1.stream().collect(Collectors.toList());
51    }
52
53    public static List<Person> computeDifference(List<Person> source, List<Person> toRemove) {
54        Set<Person> removeSet = toRemove.stream().collect(Collectors.toSet());
55        return source.stream()
56                    .filter(person -> !removeSet.contains(person))
57                    .collect(Collectors.toList());
58    }
59}

方法解释

  1. 计算交集 (computeIntersection):

    • list2转换成一个Set,这将有助于提高contains方法的性能。
    • 使用filter方法来过滤list1中的元素,只保留那些在set2中的元素。
  2. 计算并集 (computeUnion):

    • list1转换成一个Set
    • 使用addAll方法将list2中的所有元素添加到set1中,从而实现并集操作。
    • 最后将set1转换回List
  3. 计算差集 (computeDifference):

    • toRemove转换成一个Set
    • 使用filter方法来过滤source中的元素,排除掉那些在removeSet中的元素。

输出结果

当运行上述代码时,你会得到以下输出:

复制代码

深色版本

复制代码
1交集: [Person{name='Bob', age=30}, Person{name='Charlie', age=35}]
2并集: [Person{name='Alice', age=25}, Person{name='Bob', age=30}, Person{name='Charlie', age=35}, Person{name='David', age=40}, Person{name='Eve', age=45}, Person{name='Frank', age=50}]
3差集 (list1 - list2): [Person{name='Alice', age=25}, Person{name='David', age=40}]
4差集 (list2 - list1): [Person{name='Eve', age=45}, Person{name='Frank', age=50}]

总结

通过使用Java 8的Stream API,你可以以一种简洁且高效的方式来计算两个列表之间的交集、并集和差集。这种方法不仅提高了代码的可读性和可维护性,而且在某些情况下还能提高性能。特别是将一个列表转换为Set可以极大地提高contains方法的效率,尤其是在处理大数据量的时候。

相关推荐
你不是我我5 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
雪碧聊技术5 小时前
大模型爆火!Java后端如何抓住Agent全栈开发的风口
java·大模型·agent·全栈开发
逻辑驱动的ken6 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ8 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D9 小时前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X10 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手10 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦10 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw