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;
















