工作项目中,有遇到这样的一个问题案例,需要对List中存储的自定义对象做去重处理,这里,利用到了stream()流操作中的distinct()方法,但是,针对自定义类对象而言,无法直接利用distinct()方法,使得过滤的需求得到真正实现,需要去重写对象类的equals()与hashCode()方法。参考的文章链接如下:
此处,相关应用实验的代码如下:
package com.itheima.mycollectiondemo1;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object object) {
// 测试检测的对象是否为空,是就返回false
if (object == null) {
return false;
}
// 使用==操作符检查“参数是否为这个对象的引用”:
// 如果是对象本身,则直接返回,拦截了对本身调用的情况,算是一种性能优化。
if (object == this) {
return true;
}
// 测试两个对象所属的类是否相同,否则返回false
if (this.getClass() != object.getClass()){
return false;
}
// 对object进行类型转换以便和类A的对象进行比较
Student other = (Student)object;
if (other.getAge() == this.getAge()
&& this.name.equals(other.getName())) {
return true;
}
return false;
}
@Override
public int hashCode() {
int hash = 17;
hash = hash * 31 + this.getName().hashCode();
return hash;
}
}
运行的demo类,代码如下:
package com.itheima.mycollectiondemo1;
import java.util.ArrayList;
import java.util.List;
public class MyCollectionDemo9 {
public static void main(String[] args) {
List<Student> list1 = new ArrayList<>();
Student stu1 = new Student("Jack", 13);
Student stu2 = new Student("Jack", 13);
list1.add(stu1);
list1.add(stu2);
list1.stream().distinct().forEach(s -> System.out.println(s));
}
}
运行效果,如下图:
Student{name='Jack', age=13}
Process finished with exit code 0
从业务需求中将字面值相等的两个对象做到了去重处理,达到了过滤相同字面值数据的目的。特此,做一下笔记记录,其中的一些理论基础,仍需要再做学习了解。