java stream 去重使用子属性
时间: 2023-10-24 16:14:29 浏览: 85
JAVA去重复
如果您需要在 Stream 中根据某个子属性进行去重操作,可以使用 `distinct()` 方法的重载版本,该版本接受一个自定义的 `hashCode()` 方法和 `equals()` 方法实现作为参数。具体实现步骤如下:
1. 定义一个包含多个重复元素的对象集合,假设该集合中的元素类型为 `Person`,每个 `Person` 对象包含一个字符串类型的属性 `name` 和一个整数类型的属性 `age`。
2. 使用 `stream()` 方法将该集合转换为一个 Stream 对象。
3. 调用 `distinct()` 方法,并将其参数设置为一个自定义的 `hashCode()` 方法和 `equals()` 方法实现。在 `hashCode()` 方法和 `equals()` 方法中,分别使用需要进行去重的子属性来计算对象的哈希值和进行对象比较。
4. 使用 `collect(Collectors.toList())` 方法将去重后的元素重新收集到一个 List 集合中。
具体代码实现如下:
```java
List<Person> personList = Arrays.asList(
new Person("Tom", 20),
new Person("Jerry", 30),
new Person("Tom", 25),
new Person("Alice", 25)
);
List<Person> distinctPersonList = personList.stream().distinct()
.collect(Collectors.toList());
System.out.println(distinctPersonList);
// 自定义 Person 类
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 重写 hashCode() 和 equals() 方法,使用 name 属性进行比较
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Person)) {
return false;
}
Person other = (Person) obj;
return this.name.equals(other.name);
}
}
```
上述代码中,定义了一个包含多个重复元素的 `Person` 对象集合 `personList`,其中的 `Person` 对象使用 `name` 属性进行比较。接着使用 `stream()` 方法将其转换为一个 Stream 对象,然后调用 `distinct()` 方法,并将其参数设置为一个自定义的 `hashCode()` 方法和 `equals()` 方法实现。在 `hashCode()` 方法和 `equals()` 方法中,分别使用 `name` 属性来计算对象的哈希值和进行对象比较。最终使用 `collect(Collectors.toList())` 方法将去重后的元素重新收集到一个 List 集合中,得到的 `distinctPersonList` 集合中只包含了不重复的 `Person` 对象。
阅读全文