Requirements:
去重List内重复对象(此处重复定义与对象属性值有关)
Achievement:
List Stream 对象调用distinct()方法,distinct()方法依赖hashCode()和equals()方法。
判断两个对象是否相同原理与HashMap定位key原理相同,先计算hashCode,如果hashCode相同继续调用equals()方法。
List<Animal> animals = new ArrayList<>(
Arrays.asList(
new Animal("wangwang", 3),
new Animal("wangwang", 3),
new Animal("guagua", 2)
)
);
System.out.println(animals);
System.out.println(animals.stream().distinct().collect(Collectors.toList()));
Console:
[Animal{name=‘wangwang’, age=3}, Animal{name=‘wangwang’, age=3}, Animal{name=‘guagua’, age=2}]
[Animal{name=‘wangwang’, age=3}, Animal{name=‘guagua’, age=2}]
Animal Class:
public class Animal {
private String name;
private Integer age;
public Animal(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Animal animal = (Animal) o;
return Objects.equals(name, animal.name) && Objects.equals(age, animal.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Animal{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}