stream流的distinct如何将父类的属性也一起比较?
时间: 2024-09-20 10:03:59 浏览: 22
Java8新特性Stream流实例详解
5星 · 资源好评率100%
`Stream` 的 `distinct()` 方法主要用于去除其中重复的元素,它默认按照元素的哈希值和equals方法来进行比较。如果你想让父类的属性也被考虑进去,特别是当你的集合包含子类对象,并且这些子类实现了 `equals()` 和 `hashCode()` 方法来表示它们之间的相等性时,你应该确保这些方法能够反映出父类属性的唯一性。
如果你有一个继承结构,比如父类 `Person`,子类 `Employee` 或者 `Student`,并且你想基于 `Person` 中的某个属性,如 `name` 进行去重,你需要确保 `Employee` 和 `Student` 类覆盖 `equals()` 和 `hashCode()` 方法,使得这些方法不仅依赖于自身的属性,还依赖于 `Person` 属性。
例如:
```java
class Person {
String name;
// 其他属性...
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
// 子类 Employee 和 Student 都需要覆盖 equals() 和 hashCode() 方法,包括 Person 的 name
```
然后你可以这样操作 `Stream`:
```java
List<Person> list = ...; // 包含各种类型的Person实例
list.stream()
.filter(distinctByKey(p -> p.getName())) // 使用自定义函数提取名字并去重
.collect(Collectors.toList());
```
这里假设 `distinctByKey()` 函数是一个辅助工具,用于从对象中提取用于比较的特定键。
阅读全文