Java 8 List按照某两个字段去重

在Java 8中,List是一种常用的数据结构,它可以存储多个元素,并且允许元素的重复。有时候我们需要根据某两个字段去重,即根据这两个字段的值判断两个元素是否相同,如果相同则只保留一个元素。本文将介绍如何使用Java 8的功能来实现这一需求。

问题描述

假设我们有一个List,其中包含了多个Person对象,每个Person对象都有一个唯一的id和一个name字段。我们希望根据id和name字段去重,即如果两个Person对象的id和name字段的值都相同,则只保留一个对象。

代码示例

首先,我们需要定义一个Person类,包含id和name两个字段,并且实现hashCode()和equals()方法,以便于后续去重操作。

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

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

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return id == person.id && Objects.equals(name, person.name);
    }
}

接下来,我们创建一个List,其中包含了多个Person对象,包括重复的对象。

List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "Alice"));
personList.add(new Person(2, "Bob"));
personList.add(new Person(1, "Alice"));
personList.add(new Person(3, "Charlie"));
personList.add(new Person(2, "Bob"));

现在我们可以使用Java 8的特性来去重List。首先,我们可以使用stream()方法将List转换为Stream,然后调用distinct()方法去除重复的元素。

List<Person> distinctPersonList = personList.stream().distinct().collect(Collectors.toList());

以上代码将返回一个去重后的List,其中包含了唯一的Person对象。在这里,我们使用了distinct()方法来去除重复的元素,它会根据对象的hashCode()和equals()方法来判断两个对象是否相同。

流程图

下面是根据以上代码编写的流程图,它展示了整个去重的过程。

flowchart TD
    A(开始)
    B(创建List并添加元素)
    C(将List转换为Stream)
    D(去除重复的元素)
    E(将Stream转换为List)
    F(结束)
    A --> B --> C --> D --> E --> F

状态图

下面是根据Person类编写的状态图,它展示了Person对象的状态变化。

stateDiagram
    [*] --> Person
    Person --> [*]

在状态图中,[*]表示对象的初始状态,Person表示Person对象。状态图展示了对象从初始状态到Person状态的转换,以及从Person状态返回初始状态的转换。

完整代码示例

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1, "Alice"));
        personList.add(new Person(2, "Bob"));
        personList.add(new Person(1, "Alice"));
        personList.add(new Person(3, "Charlie"));
        personList.add(new Person(2, "Bob"));

        List<Person> distinctPersonList = personList.stream().distinct().collect(Collectors.toList());
        System.out.println(distinctPersonList);
    }
}

class Person {
    private int id;
    private String name;

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

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;