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进行去重操作。