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}
可以看到,根据学生的年龄属性进行去重