Java 8 List多个属性去重
引言
在Java开发中,我们经常需要对List进行去重操作。通常情况下,我们可以使用Set来实现去重功能,因为Set不允许元素重复。然而,当我们需要根据多个属性进行去重时,使用Set就无法满足需求了。在Java 8中,提供了一种简洁高效的方式来进行List多个属性的去重操作。
问题描述
假设我们有一个Person类,包含了姓名(name)和年龄(age)两个属性。我们有一个List,包含了多个Person对象。我们需要从这个List中去除重复的Person,按照姓名和年龄都相同的情况视为重复。
问题分析
在分析问题之前,我们先来了解一下Java 8中的新特性:Lambda表达式和Stream API。Lambda表达式是一种简洁的语法,可以用于替代匿名内部类。Stream API是一种用于操作集合的新API,可以进行过滤、映射、排序、归约等操作。
我们可以使用Stream API来解决这个问题。首先,我们将List转换成一个Stream。然后,使用distinct方法对Stream进行去重操作。最后,将去重后的Stream转换回List。
代码实现
下面是一个示例代码,展示了如何使用Java 8的Stream API对List进行多个属性的去重操作。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice", 20));
persons.add(new Person("Bob", 30));
persons.add(new Person("Alice", 20));
persons.add(new Person("Bob", 30));
persons.add(new Person("Bob", 40));
List<Person> distinctPersons = persons.stream()
.distinct()
.collect(Collectors.toList());
distinctPersons.forEach(System.out::println);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return name.hashCode() + age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
运行以上代码,输出结果如下:
Person{name='Alice', age=20}
Person{name='Bob', age=30}
Person{name='Bob', age=40}
解释与总结
在以上代码中,我们定义了一个Person类,重写了equals和hashCode方法,以便在去重操作中判断两个Person对象是否相等。然后,我们创建了一个List,并添加了多个Person对象。接下来,我们使用Stream API的distinct方法对List进行去重操作,得到一个去重后的List。
需要注意的是,为了正确地进行去重操作,我们必须重写Person类的equals和hashCode方法。在equals方法中,我们判断两个Person对象的姓名和年龄是否相等。在hashCode方法中,我们将姓名和年龄的hashCode相加,以确保相等的Person对象有相等的hashCode。
通过使用Java 8的Stream API,我们可以方便地进行List多个属性的去重操作。这种方法简洁高效,而且能够很好地满足我们的需求。
关系图
下面是一个关系图,展示了Person类的属性关系。
erDiagram
Person }|..|{ List
Person {
String name
int age
}
总结
本文介绍了Java 8中如何使用Stream API对List进行多个属性的去重操作。通过重写equals和hashCode方法,我们可以方便地判断两个Person对象是否相等。使用Stream API的distinct方法,我们可以很容易地对List进行去重操作。