Java 8 中两个实体类的 List 集合的交集

在 Java 8 中,处理集合的功能得到了极大的增强,特别是在操作 List 这类集合时,使用流(Stream)的方式成为了效率更高的选择。本文将介绍如何找出两个实体类的 List 集合的交集,并通过代码示例来深入理解这个过程。同时,我们还将通过完整的方式展示如何实现这一功能。

实体类的定义

首先,我们需要定义两个实体类,例如 Person

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getters and setters

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return age == person.age && name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{name='" + name + '\'' + ", age=" + age + '}';
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

这里定义了一个 Person 类,包含 nameage 字段,以及合适的 equalshashCode 方法。这很重要,因为我们需要使用这两个方法来确定对象是否相等。

创建 List 集合

接着,我们创建两个 List<Person> 集合:

List<Person> list1 = new ArrayList<>();
list1.add(new Person("Alice", 30));
list1.add(new Person("Bob", 25));
list1.add(new Person("Charlie", 35));

List<Person> list2 = new ArrayList<>();
list2.add(new Person("Alice", 30));
list2.add(new Person("David", 40));
list2.add(new Person("Eve", 28));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

这两个列表分别包含了一些 Person 对象。下一步,我们将使用 Java 8 的流来找出这两个列表的交集。

寻找交集

在 Java 8 中,可以利用 Streamfiltercollect 方法来实现两个集合的交集:

List<Person> intersection = list1.stream()
        .filter(list2::contains)
        .collect(Collectors.toList());
  • 1.
  • 2.
  • 3.
代码解析
  • list1.stream():将 list1 转换为流。
  • filter(list2::contains):对 list1 中的每个元素,判断它是否存在于 list2 中。
  • collect(Collectors.toList()):将过滤后的结果收集为一个新的 List

输出结果

最后,将交集结果打印输出:

System.out.println("Intersection: " + intersection);
  • 1.

完整示例代码

将上述代码整合为一个完整的 Java 应用程序,如下所示:

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Person> list1 = new ArrayList<>();
        list1.add(new Person("Alice", 30));
        list1.add(new Person("Bob", 25));
        list1.add(new Person("Charlie", 35));

        List<Person> list2 = new ArrayList<>();
        list2.add(new Person("Alice", 30));
        list2.add(new Person("David", 40));
        list2.add(new Person("Eve", 28));

        List<Person> intersection = list1.stream()
                .filter(list2::contains)
                .collect(Collectors.toList());

        System.out.println("Intersection: " + intersection);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

旅程图

根据代码实现的顺序,我们可以使用 Mermaid 语法展示代码的运作旅程:

Java 8 List Intersection Journey Me
Create Lists
Create Lists
Me
Create list1 of Person
Create list1 of Person
Me
Create list2 of Person
Create list2 of Person
Find Intersection
Find Intersection
Me
Filter list1 where list2 contains
Filter list1 where list2 contains
Me
Collect results into intersection
Collect results into intersection
Print Result
Print Result
Me
Output intersection
Output intersection
Java 8 List Intersection Journey

小结

在 Java 8 中,利用 Stream 可以非常简洁地找出两个 List 集合的交集。通过实现 equalshashCode 方法,可以让对象的比较更加精确。希望本文的示例代码能帮助你更好地理解和运用 Java 8 的集合操作功能!如有任何疑问,欢迎交流讨论。