Java 8 根据对象某个属性去重

在Java编程中,有时我们需要根据一个对象的某个属性来进行去重操作。例如,我们有一个包含多个学生对象的列表,我们希望根据学生的姓名来去重,即不考虑重复的姓名。在Java 8中,我们可以使用Stream API来轻松实现这个功能。

使用Stream的distinct方法

Java 8引入了Stream API,它提供了强大的功能来处理集合中的对象。其中一个有用的方法是distinct(),它可以根据对象的属性或自定义的判定条件来去除重复的元素。

下面是一个示例代码,演示如何使用Stream的distinct()方法根据学生对象的姓名属性进行去重操作:

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

class Student {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("Alice", 18));
        students.add(new Student("Bob", 20));
        students.add(new Student("Alice", 18));
        students.add(new Student("Charlie", 19));

        List<Student> distinctStudents = students.stream()
                .distinct()
                .collect(Collectors.toList());

        distinctStudents.forEach(System.out::println);
    }
}

上述代码中,我们定义了一个Student类,包含姓名和年龄属性。然后创建了一个包含多个学生对象的列表students。接着,我们使用Stream的distinct()方法对学生列表进行去重操作,并将结果收集到一个新的列表distinctStudents中。最后,使用forEach()方法打印去重后的学生列表。

运行上述代码,输出结果如下:

Student{name='Alice', age=18}
Student{name='Bob', age=20}
Student{name='Charlie', age=19}

可以看到,根据学生的姓名属性进行去重后,列表中只保留了一个"Alice"对象。

根据自定义判定条件进行去重

除了使用对象的属性进行去重外,我们还可以使用自定义的判定条件来去除重复的元素。Stream的distinct()方法接受一个Predicate参数,我们可以在该参数中指定自定义的判定条件。

下面是一个示例代码,演示如何根据学生对象的年龄属性进行去重操作:

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

class Student {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Student student = (Student) obj;
        return age == student.age;
    }

    @Override
    public int hashCode() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("Alice", 18));
        students.add(new Student("Bob", 20));
        students.add(new Student("Alice", 18));
        students.add(new Student("Charlie", 19));

        List<Student> distinctStudents = students.stream()
                .distinct()
                .collect(Collectors.toList());

        distinctStudents.forEach(System.out::println);
    }
}

在上述代码中,我们重写了Student类的equals()hashCode()方法,其中equals()方法根据学生对象的年龄属性进行判断。然后使用Stream的distinct()方法进行去重操作。

运行上述代码,输出结果如下:

Student{name='Alice', age=18}
Student{name='Bob', age=20}

可以看到,根据学生的年龄属性进行去重